将32位整数复制到64位整数是不确定的?

时间:2015-04-09 23:49:49

标签: c int

嗯,我知道<< 32在32位整数上是未定义的......我也知道指针转换和取消引用并不是很多。

但是这一个都没有。

test.c的:

#include <stdio.h>
#include <stdlib.h>
#define __STDC_FORMAT_MACROS
#include <inttypes.h>

int main(void)
{
    uint64_t tmp = 1 << 31;
    printf("%" PRIx64 "\n", tmp);
    return 0;
}

然后我这样做:

$ gcc test.c -o test
$ ./test
ffffffff80000000

为什么它破坏了前4个字节?

较低班次工作正常。 如果我printf("%x\n", 1 << 31),它会按预期产生80000000。 如果tmp是32位,它也可以正常工作。

u64__u64也有这个怪癖。

1 个答案:

答案 0 :(得分:4)

你没有破坏任何东西,但你也没有移动64位数字。在C中,单个1默认为int。如果您想将1用作unsigned long(或unsigned),请通过在(ULU - ({{后缀数字的情况下告诉编译器 x86 )上的{1}},否则您要转移带符号的数字:

ULL

<强>输出

uint64_t tmp = 1ULL << 31;