#include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { printf("\n%%u=%u,%%llu=%llu,%%llu=%llu",0x100000000u,0x0ffffffffu<<1,0x1ffffffff<<1);return 0; }
64位的GCC编译器。
结果“%u=0,%llu=4294967294,%llu=17179869182”。
0xffff ffff =1111 1111 1111 1111 1111 1111 1111 1111
4294967294 =1111 1111 1111 1111 1111 1111 1111 1110
小于32位的常量被当做最大长度为32位的类型处理
0x1 ffff ffff =0001 1111 1111 1111 1111 1111 1111 1111 1111
17179869182 =0011 1111 1111 1111 1111 1111 1111 1111 1110
大于32位的常量被当做最大长度为64位的类型处理
所以不能用(0xffff ffff<<32)+0xffff ffff的形式来获得64位的数,编译器为了省内存也限制了代码的随意性。