添加有符号和无符号整数

问题描述 投票:0回答:4
#include <stdio.h>

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

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

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

signed
unsigned
整数的相加。

运行此代码时,输出为

> 6
;为什么?

c implicit-conversion unsigned-integer
4个回答
26
投票

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

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

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

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

(a + (unsigned int)b > 6)

要修复它,您需要显式地向另一个方向进行转换,即:

((int)a + b > 6)

所以这就是输出 将是

>6
NOT
<=6

的原因

9
投票

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

输出为

>6
,因为
(a + b)
也将
b
转换为 unsigned int

编辑:

请参阅 Acme 的解决此问题的建议。本质上,将 a

 转换为 
int
 将解决这个问题


5
投票
因为

4294967282>6

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


5
投票
您的代码的简单形式如下:

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

输出将是:

>6 as (a + (unsigned int)b > 6)
    
© www.soinside.com 2019 - 2024. All rights reserved.