C语言 添加有符号和无符号int

7bsow1i6  于 2023-10-16  发布在  其他
关注(0)|答案(4)|浏览(83)
#include <stdio.h>

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

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

我很清楚 * 三元运算符 * 在这段代码中是如何工作的。我无法理解这里的signedunsigned整数的加法。
运行此代码时,输出为> 6;为什麽?

ajsxfq5m

ajsxfq5m1#

我认为OP不会对三元运算符感到困惑,这是一个不同的问题。
根据C99标准,6.3.1.8部分(“算术转换”):
如果具有无符号整数类型的操作数的秩大于或等于另一操作数的类型的秩,则具有有符号整数类型的操作数被转换为具有无符号整数类型的操作数的类型。
unsigned intint具有相同的秩,所以它等价于:

(a + (unsigned int)b > 6)

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

((int)a + b > 6)

所以这就是输出将是>6不是<=6的原因

n3schb8v

n3schb8v2#

另外两个答案准确地描述了三进制运算符,但我认为这与问题更相关
输出是>6,因为(a + b)也将b转换为unsigned int
编辑:
请参阅Acme的建议来解决此问题。本质上**将a转换为int**将解决此问题

rhfm7lfc

rhfm7lfc3#

因为4294967282>6为true,所以输出为>64294967282来自将-14分配给unsigned int(a+b)将被转换为2^32 - 14。`

ct2axkht

ct2axkht4#

代码的简单形式如下:

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

输出将是:

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

相关问题