int main()
{
unsigned n;
cin>>n;
for(int i=(1<<31);i>0;i/=2)
(i&n)?(cout<<1):(cout<<0);
}
我运行下面的代码与n = 1但它没有在控制台上打印任何东西。将变量i的类型更改为无符号的技巧并打印00000000000000000000000000000001.任何想法为什么?十进制数字到32位二进制
int main()
{
unsigned n;
cin>>n;
for(int i=(1<<31);i>0;i/=2)
(i&n)?(cout<<1):(cout<<0);
}
我运行下面的代码与n = 1但它没有在控制台上打印任何东西。将变量i的类型更改为无符号的技巧并打印00000000000000000000000000000001.任何想法为什么?十进制数字到32位二进制
鉴于你的平台是32位的,int i的值(我< < 31)是一个负数。所以,执行永远不会进入for-loop,因为你需要i> 0。
是我没有注意到这个错误。它非常有意义。谢谢你指出。很愚蠢的一个错误。 –
假设二进制补码,1 << 31
的结果为负值,所以您对i> 0的测试在第一次测试时立即失败。那么你很可能会有更多的运气,然后i != 0
。
但我们知道1 << 31
是一个有符号的整数溢出,无论如何这都是未定义的行为!所以你也应该做1U << 31
。如果将这个正值赋给一个不能保存它的带符号整数,那么你又有一个未定义的行为。所以,正确的for循环应该是这样的:
for(unsigned int i = 1U << 31; i > 0; i /= 2)
虽然i /= 2
无符号值相当于位位移(并且很可能被编译),我会明确地在这里(i >>= 1
)prefere的位位移操作,如这是你真正想要的。
啊,我看到..非常感谢..我没有注意到我自己放在我的循环中的符号条件..感谢指出溢出位!将使用'1U << 31' –
什么是有符号32位变量的数字0x80000000 ....? – LPs
循环的最终条件是什么...? – stefaanv
['i/= 2'和'i >> = 1'不一样](https://stackoverflow.com/q/10681375/995714) –