【问题标题】:Unsigned vs Signed Integer [duplicate]无符号与有符号整数[重复]
【发布时间】:2018-09-15 04:52:45
【问题描述】:

这段代码有什么问题?

#include<stdio.h>
int main()
{
    unsigned int  i;
    for(i=100;i>=0;i--)
    {
        printf("%u ",i);
    }
  return 0;
}

此代码不起作用,但如果我使用 for(i=100;i&gt;0;i--),它就会起作用! 或者另一种方法是使用整数而不是使用无符号整数。

【问题讨论】:

  • unsigned 总是 >=0,所以它永远循环。
  • 当i为0时,执行print语句,然后i递减,然后将i变为最大值,总是大于等于0
  • 您可以将i&gt;=0 替换为i&lt;101,但只使用有符号整数会更简洁。

标签: c


【解决方案1】:

unsigned int 永远不会是负数,因此 i &gt;= 0 始终保持 true。所以,它实际上是一个无限循环。

【讨论】:

    【解决方案2】:

    由于变量i 被声明为unsigned int,这个条件i&gt;=0 永远不会失败,因此会导致无限循环旋转。

    unsigned int  i;
    for(i=100;i>=0;i--) { /* i will never become negative */
        printf("%u \n",i);
    }
    

    注意UINT_MAX4294967295 see this 即它的范围是0 to 4294967295 所以当i=0 打印并递减时,接下来它不会是-1,而是4294967295,因此以上for 循环导致无限循环。

    另一种方法是使用整数而不是使用无符号整数?您可以使用unsigned integer 也可以通过将条件部分替换为i&gt;0 来执行相同操作,这样当i=0 失败时&退出循环。

    【讨论】:

      【解决方案3】:

      这段代码有什么问题?

      i&gt;=0 始终为真,因为 iunsigned。然后for(i=100;i&gt;=0;i--) 永远循环。


      继续使用unsigned i

      由于编码目标总是希望至少进入循环一次,所以不要在开始时测试循环条件,而是在结束时进行测试。

      //for(i=100;i>=0;i--) {
      //    printf("%u ",i);
      //}
      
      i = 100; // or any unsigned constant.
      do {
          printf("%u ",i);
      } while (i-- > 0);
      

      另一种方法是使用整数 (int) 而不是使用无符号整数 (unsigned)。(?)

      使用int。当然,如果i 需要从大于INT_MAX 的值开始,这将不起作用。如果需要如此大的值,请考虑使用更广泛的有符号类型,例如 long long

      int i; 
      for(i=100;i>=0;i--) {
          printf("%u ",i);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-19
        • 2012-10-20
        • 2011-06-10
        • 1970-01-01
        • 1970-01-01
        • 2013-10-02
        • 2012-04-19
        • 1970-01-01
        相关资源
        最近更新 更多