如何通过位移将 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?
除了您使用的格式说明符错误(%d
而不是 %u
),您可能通过将 1 移入 [= 的符号位来调用未定义的行为13=] 操作数,如 this answer.
中所述
要修复它,请使用无符号文字:
unsigned int a = 1u << 31;
// ^
为什么执行此操作时得到负数?
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?
除了您使用的格式说明符错误(%d
而不是 %u
),您可能通过将 1 移入 [= 的符号位来调用未定义的行为13=] 操作数,如 this answer.
中所述
要修复它,请使用无符号文字:
unsigned int a = 1u << 31;
// ^