0
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。为什么会这样?

4

3 回答 3

5

这是因为第一位是符号位。

当符号位为1时,数字为负数,11111111 11111111 11111111 11111111恰好是数字的 32 位表示-1

您可能想查看Two's Complement

于 2013-07-19T23:26:49.527 回答
3

在您的 printf 语句中,您使用的是%d,它打印一个有符号整数。由于设置了符号位,输出是正确的。

将格式字符串更改为%u,它将显示无符号整数值。没有更多的符号位和您正在寻找的值。

无论如何,您都应该为samp使用unsigned int

于 2013-07-20T00:51:41.147 回答
0

由于现代计算机中的有符号整数表示为二补码: http ://en.wikipedia.org/wiki/Two%27s_complement

于 2013-07-20T00:08:58.650 回答