【问题标题】:Adding signed and unsigned int添加有符号和无符号整数
【发布时间】:2013-10-27 03:12:17
【问题描述】:
int main()
{
  unsigned int a=6;
  int b=-20;

  (a+b)>6?puts(">6"):puts("<=6");
}

我很清楚 三元运算符 在这段代码中是如何工作的。我无法理解这里添加了 signedunsigned integer

尝试运行代码,输出为“>6”,为什么?

【问题讨论】:

  • 了解三元运算符:en.wikipedia.org/wiki/%3F:#C
  • @georgesl 我认为整个“挑战”是关于知道在unsigned int aint b 之间添加a + b 是什么类型。 (坦率地说,我并不在意,因为我的编码标准禁止在未将所有内容转换为明确的相同类型的情况下执行算术运算。)
  • @DanielDaranas:很有可能。但是 OP 会很好地在问题中说明这一点;)
  • 我不是对三元运算符感到困惑,而是对有符号和无符号整数的加法感到困惑

标签: c


【解决方案1】:

我认为 OP 不会对三元运算符感到困惑,这是一个不同的问题。

来自 C99 标准,第 6.3.1.8 节(“常用算术转换”):

如果具有无符号整数类型的操作数的秩大于或 等于另一个操作数的类型的等级,然后是操作数 带符号整数类型转换为操作数的类型 无符号整数类型。

unsigned intint 排名相同,所以相当于:

(a + (unsigned int)b > 6)

要修复它,您需要明确地向另一个方向投射,即:

((int)a + b > 6)

所以这就是输出将是 &gt;6不是 &lt;=6

的原因

【讨论】:

    【解决方案2】:

    另外两个答案准确地描述了三元运算符,但我认为这与问题更相关

    输出为&gt;6,因为(a + b) 也将b 转换为无符号整数

    编辑:

    请参阅 Acme 的解决此问题的建议。基本上a 转换为int 将解决此问题

    【讨论】:

      【解决方案3】:

      你的代码的简单形式如下:

      if(a + (unsigned int)b > 6)
      {
          puts(">6")
      }
      else
      {
          puts("<=6");
      }
      

      输出将是:

      >6 as (a + (unsigned int)b > 6)
      

      【讨论】:

        【解决方案4】:

        因为4294967282&gt;6 为真,您将得到&gt;6 作为输出。 4294967282 来自将-14 分配给unsigned int(a+b) 将转换为 2^32 - 14。 `

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-02-04
          • 2013-10-02
          • 2015-02-17
          • 1970-01-01
          • 1970-01-01
          • 2015-02-24
          • 1970-01-01
          相关资源
          最近更新 更多