曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 7064|回复: 0
打印 上一主题 下一主题

不同类型之间的比较(size_t)

[复制链接]

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
跳转到指定楼层
楼主
发表于 2009-7-27 12:08:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
size_t 类型一般根据系统不同而有所不同的定义。

在 glob.h 里看到:
define __size_t size_t
typedef __SIZE_TYPE__ __size_t;
typedef __SIZE_TYPE__ size_t;

__SIZE_TYPE__
类型是个预定义宏,对于 IA-32 架构,__SIZE_TYPE__ 为 unsigned int 类型。
( 关于预定义宏,参考:http://parallel.ru/docs/Intel/c_ug/linux305.htm )



测试程序(不同类型之间的比较)
#include <stdio.h>

int main()
{
    size_t    unsigl = 1;
    int    inttype = -1;
    if (inttype < unsigl) {
        printf("Bad!\n");
    }

    return 0;
}
运行及输出
无输出,也就是说,没进到 if 为假。为什么 1 小于 -1 ?

objdump -d unisgl 来看一下反汇编:
08048414 <main>:
  8048414:    8d 4c 24 04              lea    0x4(%esp),%ecx
  8048418:    83 e4 f0                 and    $0xfffffff0,%esp
  804841b:    ff 71 fc                 pushl  -0x4(%ecx)
  804841e:    55                       push   %ebp
  804841f:    89 e5                    mov    %esp,%ebp
  8048421:    51                       push   %ecx
  8048422:    83 ec 14                 sub    $0x14,%esp
  8048425:    c7 45 f4 01 00 00 00     movl   $0x1,-0xc(%ebp)
  804842c:    c7 45 f8 ff ff ff ff     movl   $0xffffffff,-0x8(%ebp)
  8048433:    8b 45 f8                 mov    -0x8(%ebp),%eax
  8048436:    3b 45 f4                 cmp    -0xc(%ebp),%eax
  8048439:    73 0c                    jae    8048447 <main+0x33>

更改一下程序中的 signl 变量的声明为:
int signal;

那么再编译运行后,可以看到 printf() 的输出,这时再看一下反汇编:
08048414 <main>:
  8048414:    8d 4c 24 04              lea    0x4(%esp),%ecx
  8048418:    83 e4 f0                 and    $0xfffffff0,%esp
  804841b:    ff 71 fc                 pushl  -0x4(%ecx)
  804841e:    55                       push   %ebp
  804841f:    89 e5                    mov    %esp,%ebp
  8048421:    51                       push   %ecx
  8048422:    83 ec 14                 sub    $0x14,%esp
  8048425:    c7 45 f4 01 00 00 00     movl   $0x1,-0xc(%ebp)
  804842c:    c7 45 f8 ff ff ff ff     movl   $0xffffffff,-0x8(%ebp)
  8048433:    8b 45 f8                 mov    -0x8(%ebp),%eax
  8048436:    3b 45 f4                 cmp    -0xc(%ebp),%eax
  8048439:    7d 0c                    jge    8048447 <main+0x33>

由上面的两个反汇编代码可以看到,蓝色部分没有什么不同,不同的是 jge 和 jae 这两个指令。这两个指令的区别是:
1、JAE:条件转移指令,当目的操作数高于或等于源操作数时转移,用于无符号数的比较或判断。
2、JGE:条件转移指令,当目的操作数大于或等于源操作数时转移,用于有符号数的比较或判断。
所以,在第一个程序中,-1 被转换为无符号数来比较,自然是 0xFFFFFFFF > 0x01 了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-13 18:45 , Processed in 0.066348 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表