2017-06-07 53 views
-1
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位二进制

+1

什么是有符号32位变量的数字0x80000000 ....? – LPs

+0

循环的最终条件是什么...? – stefaanv

+2

['i/= 2'和'i >> = 1'不一样](https://stackoverflow.com/q/10681375/995714) –

回答

2

鉴于你的平台是32位的,int i的值(我< < 31)是一个负数。所以,执行永远不会进入for-loop,因为你需要i> 0。

+0

是我没有注意到这个错误。它非常有意义。谢谢你指出。很愚蠢的一个错误。 –

3

假设二进制补码,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的位位移操作,如这是你真正想要的。

+0

啊,我看到..非常感谢..我没有注意到我自己放在我的循环中的符号条件..感谢指出溢出位!将使用'1U << 31' –