int samp=0;
for(i=0;i<=31;i++)
{
samp=samp|1<<i;
}
printf("\ %d\n",samp);
输出:
-1
如果我循环到i<=31
(将所有32位设置为1),为什么它给-1?
当我只循环i<31
时,它给出2147483647.为什么会这样?
答案 0 :(得分:5)
这是因为第一位是符号位。
当符号位为1
时,数字为负数,而11111111 11111111 11111111 11111111
恰好是数字-1
的32位表示。
您可以查看Two's Complement。
答案 1 :(得分:3)
在printf语句中,您使用%d ,这会打印有符号整数。由于符号位已设置,输出正确。
将格式字符串更改为%u ,它将显示无符号整数值。没有更多的符号位和您正在寻找的价值。
对于 samp ,你应该使用 unsigned int 。
答案 2 :(得分:0)
由于现代计算机中的有符号整数表示为双补码: http://en.wikipedia.org/wiki/Two%27s_complement