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

posted @ 2018-12-25 10:55  王纯真  阅读(413)  评论(0编辑  收藏  举报