如何通过位移将无符号整数转换为负数?

时间:2016-11-29 16:02:58

标签: c bitwise-operators

执行此操作时为什么会得到负数?

unsigned int a = 1 << 31;
printf("%d",a);

我已经在计算机上检查了整数大小,它是4字节。所以我的整数由32位组成,向左移动31次,直到最高位为止。这意味着它应该是正数,但我总是消极的。

我得到的:-2147483648

我的期望:一些正数(可能是1073741824)

我在这里缺少什么?

3 个答案:

答案 0 :(得分:0)

使用%u作为printf格式字符串。

意义:

printf("%u",a);

答案 1 :(得分:0)

问题不在于你有点转移。您只是不打印相应的格式。

%d或%i用于打印int,因此当您尝试打印unsigned int时,它将转换为signed int。

见这里:What is the format specifier for unsigned short int?

https://www.le.ac.uk/users/rjm1/cotter/page_30.htm

答案 2 :(得分:0)

除了使用(%d而不是%u)的错误格式说明符之外,您可能通过将1转换为符号位来调用未定义的行为。 int操作数,this answer中所述 要修复它,请使用无符号文字:

unsigned int a = 1u << 31;
//                ^