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