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。为什么会这样?
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。为什么会这样?
这是因为第一位是符号位。
当符号位为1
时,数字为负数,11111111 11111111 11111111 11111111
恰好是数字的 32 位表示-1
。
您可能想查看Two's Complement。
在您的 printf 语句中,您使用的是%d,它打印一个有符号整数。由于设置了符号位,输出是正确的。
将格式字符串更改为%u,它将显示无符号整数值。没有更多的符号位和您正在寻找的值。
无论如何,您都应该为samp使用unsigned int。
由于现代计算机中的有符号整数表示为二补码: http ://en.wikipedia.org/wiki/Two%27s_complement