[英]Bit manipulation in c
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
恰好是数字-1
的32位表示形式。
您可能要检查出Two's Complement 。
在您的printf语句中,您正在使用%d ,它输出一个带符号的integer 。 由于设置了符号位,因此输出正确。
将格式字符串更改为%u ,它将显示无符号整数值。 没有更多的符号位和您想要的值。
无论如何,您都应该将unsigned int用于samp 。
由于现代计算机中的带符号整数表示为两个补码: http : //en.wikipedia.org/wiki/Two%27s_complement
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.