我写了这段代码来了解位移。令我惊讶的是,即使我将x
声明为unsigned int
,输出也包含一个负数,即当最左边的位设置为1.我的问题:为什么?我认为unsigned int
永远不会消极。每sizeof(x)
,x
宽度为4个字节。
这是代码片段:
int main(void)
{
unsigned int x;
x = 1;
for (int i = 0; i < 32; i++)
{
printf("2^%i = %i\n", i, x);
x <<= 1;
}
return 0;
}
这是输出:
2^0 = 1
2^1 = 2
2^2 = 4
2^3 = 8
2^4 = 16
2^5 = 32
2^6 = 64
2^7 = 128
2^8 = 256
2^9 = 512
2^10 = 1024
2^11 = 2048
2^12 = 4096
2^13 = 8192
2^14 = 16384
2^15 = 32768
2^16 = 65536
2^17 = 131072
2^18 = 262144
2^19 = 524288
2^20 = 1048576
2^21 = 2097152
2^22 = 4194304
2^23 = 8388608
2^24 = 16777216
2^25 = 33554432
2^26 = 67108864
2^27 = 134217728
2^28 = 268435456
2^29 = 536870912
2^30 = 1073741824
2^31 = -2147483648
答案 0 :(得分:4)
只需使用正确的转换符号
即可printf("2^%u = %u\n", i, x);
答案 1 :(得分:3)
您正在使用%i
格式说明符,该说明符将其参数打印为带符号的int
。
如果要打印为无符号,请使用%u
格式说明符。
printf("2^%i = %u\n", i, x);
答案 2 :(得分:3)
当你谈到C(C ++和许多其他编程语言)中的整数值的符号时,你只是在谈论如何解释某些数据。
你必须明白,unsigned int
中存储的内容只是位而不管符号,使用时它们表现为“无符号”这一事实仅仅是对值的解释。
因此,通过使用%i
说明符,您将其视为有符号值,无论其如何声明。尝试使用%u
,指定您要将其视为unsigned
。
答案 3 :(得分:1)
根据printf上的C ++参考页面,在传递给printf的字符串中使用%i意味着相应的参数将被视为 signed 十进制整数。这意味着unsigned int将被转换为signed int。 在C ++中,将unsigned转换为signed(和reverse)只会改变解释,而不是位值。因此,将最左边的位设置为1会使数字为负,因为这与有符号整数解释中的对应关系。 要达到预期的数字,请使用%u代替无符号整数解释。