GCC编译器对常量的一个处理

#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位的数,编译器为了省内存也限制了代码的随意性。

猜你喜欢

转载自www.cnblogs.com/wcz-/p/10172680.html