我刚刚编写了一个简单的反向循环:
for (unsigned int i = 50; i >= 0; i--)
printf("i = %d\n", i);
但是它并没有像预期的那样停在0,而是下降到负值,为什么呢? 请参阅此ideone示例:http://ideone.com/kkixx8
(我在c#和c ++中测试过)
答案 0 :(得分:13)
您将int声明为unsigned。它总是> = 0.您看到负值的唯一原因是您的printf调用将其解释为signed(%d)而不是unsigned(%ud)。
答案 1 :(得分:3)
虽然您没有要求解决方案,但以下是解决问题的两种常用方法:
// 1. The goes-to operator
for (unsigned int i = 51; i --> 0; )
printf("i = %d\n", i);
// 2. Waiting for overflow
for (unsigned int i = 50; i <= 50; i--)
printf("i = %d\n", i);
答案 2 :(得分:2)
unsigned int永远不会变为负数。
答案 3 :(得分:2)
在C#中这段代码
for (uint i = 50; i >= 0; i--)
Console.WriteLine(i);
产生以下输出:
50
...
7
6
5
4
3
2
1
0
4294967295
4294967294
4294967293
...
您正在使用unsigned int
。它永远不会是&lt;它只是环绕。由于格式化输出的方式(将其解释为带符号的int),您看到负值。
答案 4 :(得分:2)
i
小于零时的循环中断。但是i
是无符号的,它永远不会小于零。
答案 5 :(得分:0)
for(unsigned int i = 50; i&gt; = 0; i--) printf(“i =%d \ n”,i);
i
的值减1,当你的值i==0
然后循环减量尝试赋值时
i--
表示i=-1
等号右边的-1被设置为有符号整数(大小可能是32位),并且将具有十六进制值0xFFFFFFF4。编译器生成代码以将此有符号整数移动到无符号整数i
,该整数也是32位实体。编译器假设您只在等号右侧有一个正值,因此它只是将所有32位移动到i
。 i
现在具有值0xFFFFFFF4,如果被解释为正数,则为4294967284。但%d的printf格式表示32位将被解释为有符号整数,因此得到-1。如果您使用了%u,它将打印为4294967284。