如何通过位移将 unsigned int 转换为负数?

How it is possible to turn unsigned int to negative number with bit shift?

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

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

我已经在我的电脑上检查了整数的大小,它是 4 字节。所以我的整数由 32 位组成,向左移动 31 次我应该得到直到最高有效位。这意味着它应该是正数,但我总是得到负数。

我得到的是:-2147483648

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

我在这里错过了什么?

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

含义:

printf("%u",a);

问题不在于你在位移。您根本没有以相应的格式打印。

%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

除了您使用的格式说明符错误(%d 而不是 %u),您可能通过将 1 移入 [= 的符号位来调用未定义的行为13=] 操作数,如 this answer.
中所述 要修复它,请使用无符号文字:

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