曲径通幽论坛

标题: 不同类型之间的比较(size_t) [打印本页]

作者: beyes    时间: 2009-7-27 12:08
标题: 不同类型之间的比较(size_t)
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 了。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2