c中的位操作

时间:2013-07-19 23:24:51

标签: c bit-manipulation

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

3 个答案:

答案 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