【问题标题】:Cannot enter in while statement [duplicate]无法进入while语句[重复]
【发布时间】:2012-06-01 11:50:51
【问题描述】:

可能重复:
Unsigned and signed comparison
unsigned int and signed char comparison

当我尝试输入这个 while 语句时,我有一个奇怪的行为:

unsigned u = 0;
int i = -2;

while(i < u)
{
    // Do something
    i++;
}

但它永远不会进入,即使我设置了断点i = -2u = 0。 我究竟做错了什么?我该如何解决这个问题?

【问题讨论】:

    标签: c loops


    【解决方案1】:

    这是因为 ANSI C 标准定义,只要在限定类型(您的 unsigned int u)和非限定类型(您的 int i)之间进行比较,非限定类型就会提升为相同类型的类型(因此总是int),但也继承了其他数量的限定符(即变为unsigned)。

    当您的int(其值等于-2)变为unsigned 时,第一个字节经历了这种转换:0000 0010 -&gt; 1111 1110。您的int 现在是一个非常大的正数,肯定比您的unsigned int 更大。

    有一个解决办法:投到signed

    while(i < (signed) u)
    {
        // Do something
        i++;
    }
    

    顺便说一句,可能你的编译器应该给你一个警告。

    【讨论】:

    • 谢谢,+1 提供完整解释的解决方案。
    • 如果将 i 定义为 signed int i 会起作用吗?
    • 默认情况下,如果我们不指定signedunsigned,大多数编译器设置将假定要签名的类型,因此在这种情况下signed int i 具有与int i 相同的效果结果是一样的。
    • @gliderkite:你确定吗?在 C 中,“合格类型”是例如const intvolatile charunsigned/signed 不是限定符(而是类型说明符)。然后是:unsigned a; signed int b; a &lt; b;,其中 b 转换为 unsigned int所有 C 编译器将假定有符号类型,因为这是标准定义的(char 除外)。
    • 你的词汇和描述是错误的。标准中的“合格”是指constvolatile。这里发生的是更微妙的事情,即隐式转换。这方面的规则并不像你建议的那么直接。我建议你删除你的答案。
    【解决方案2】:

    您正在比较一个有符号和无符号整数,您的问题从那里开始...
    不要那样做,它应该可以正常工作。

    【讨论】:

      猜你喜欢
      • 2019-05-04
      • 1970-01-01
      • 1970-01-01
      • 2021-02-15
      • 1970-01-01
      • 1970-01-01
      • 2019-10-19
      • 2014-05-08
      • 2019-02-05
      相关资源
      最近更新 更多