添加有符号和无符号的int

Nar*_*gis 3 c

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

  (a+b)>6?puts(">6"):puts("<=6");
}
Run Code Online (Sandbox Code Playgroud)

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

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

Sad*_*que 15

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

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

如果具有无符号整数类型的操作数的秩大于或等于另一个操作数的类型的秩,则具有有符号整数类型的操作数将转换为具有无符号整数类型的操作数的类型.

unsigned int并且int具有相同的等级,因此它相当于:

(a + (unsigned int)b > 6)
Run Code Online (Sandbox Code Playgroud)

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

((int)a + b > 6)
Run Code Online (Sandbox Code Playgroud)

因此,这是输出的原因将是 >6不是 <=6


suk*_*vir 7

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

输出是>6因为也(a + b) 转换b为unsigned int.

编辑:

请参阅Acme关于解决此问题的建议.基本上铸造a作为一种int意志来解决这个问题


Hem*_*lia 5

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

if(a + (unsigned int)b > 6)
{
    puts(">6")
}
else
{
    puts("<=6");
}
Run Code Online (Sandbox Code Playgroud)

输出将是:

>6 as (a + (unsigned int)b > 6)
Run Code Online (Sandbox Code Playgroud)


Day*_*rai 5

因为4294967282>6是真的,你会得到>6作为输出。4294967282来自分配-14给 a unsigned int(a+b)将被转换为2^32 - 14. `