int main()
{
unsigned n;
cin>>n;
for(int i=(1<<31);i>0;i/=2)
(i&n)?(cout<<1):(cout<<0);
}
我使用n = 1运行以下代码,但它在控制台上没有打印任何内容。将变量i的类型更改为unsigned做了诀窍并打印00000000000000000000000000000001.知道为什么?
答案 0 :(得分:3)
假设有两个补码,1 << 31
会产生负值,所以你对i的测试&gt;第一次测试时,0立即失败。你很可能会在i != 0
之后获得更多的运气。
但是我们知道1 << 31
是有符号整数溢出,无论如何都是未定义的行为!所以你也应该做1U << 31
。如果将正值分配给有符号的int(无法保存它),则会再次出现未定义的行为。所以正确的for循环看起来像这样:
for(unsigned int i = 1U << 31; i > 0; i /= 2)
虽然无符号值的i /= 2
等同于bitshift(并且很可能被编译为),但我会在这里明确地优先使用bitshift操作(i >>= 1
),因为这是你实际想要的
答案 1 :(得分:2)
鉴于您的平台是32位的,具有值(i <&lt; 31)的int i是负数。因此,执行永远不会进入for循环,因为你想要i> 0。