添加有符号和无符号的int

时间:2013-10-18 10:02:57

标签: c

int main()
{
  unsigned int a=6;
  int b=-20;

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

我很清楚三元运算符如何在此代码中工作。我无法理解在这里添加签名无符号整数

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

4 个答案:

答案 0 :(得分:12)

我认为OP不会对三元运算符产生混淆,这是一个不同的问题。

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

  

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

unsigned intint具有相同的排名,因此它相当于:

(a + (unsigned int)b > 6)

要修复它,你需要明确地转向另一个方向,即:

((int)a + b > 6)

所以这就是输出 >6 NOT <=6

的原因

答案 1 :(得分:7)

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

更相关

输出为>6,因为(a + b) b强制转换为无符号整数

编辑:

请参阅Acme关于解决此问题的建议。基本上施放a作为int 将解决此问题

答案 2 :(得分:4)

您的简单形式代码如下:

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

输出将是:

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

答案 3 :(得分:4)

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