|  | 
 
| 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 了。
 | 
 |