#include <stdio.h> int main(void) { unsigned int a = 6; int b = -20; a + b > 6 ? puts("> 6") : puts("<= 6"); }
我很清楚 * 三元运算符 * 在这段代码中是如何工作的。我无法理解这里的signed和unsigned整数的加法。运行此代码时,输出为> 6;为什麽?
signed
unsigned
> 6
ajsxfq5m1#
我认为OP不会对三元运算符感到困惑,这是一个不同的问题。根据C99标准,6.3.1.8部分(“算术转换”):如果具有无符号整数类型的操作数的秩大于或等于另一操作数的类型的秩,则具有有符号整数类型的操作数被转换为具有无符号整数类型的操作数的类型。unsigned int和int具有相同的秩,所以它等价于:
unsigned int
int
(a + (unsigned int)b > 6)
要修复它,您需要显式地转换为另一个方向,即:
((int)a + b > 6)
所以这就是输出将是>6而不是<=6的原因
>6
<=6
n3schb8v2#
另外两个答案准确地描述了三进制运算符,但我认为这与问题更相关输出是>6,因为(a + b)也将b转换为unsigned int。编辑:请参阅Acme的建议来解决此问题。本质上**将a转换为int**将解决此问题
(a + b)
b
a
rhfm7lfc3#
因为4294967282>6为true,所以输出为>6。4294967282来自将-14分配给unsigned int。(a+b)将被转换为2^32 - 14。`
4294967282>6
4294967282
-14
(a+b)
2^32 - 14
ct2axkht4#
代码的简单形式如下:
if(a + (unsigned int)b > 6) { puts(">6") } else { puts("<=6"); }
输出将是:
>6 as (a + (unsigned int)b > 6)
4条答案
按热度按时间ajsxfq5m1#
我认为OP不会对三元运算符感到困惑,这是一个不同的问题。
根据C99标准,6.3.1.8部分(“算术转换”):
如果具有无符号整数类型的操作数的秩大于或等于另一操作数的类型的秩,则具有有符号整数类型的操作数被转换为具有无符号整数类型的操作数的类型。
unsigned int
和int
具有相同的秩,所以它等价于:要修复它,您需要显式地转换为另一个方向,即:
所以这就是输出将是
>6
而不是<=6
的原因n3schb8v2#
另外两个答案准确地描述了三进制运算符,但我认为这与问题更相关
输出是
>6
,因为(a + b)
也将b
转换为unsigned int。编辑:
请参阅Acme的建议来解决此问题。本质上**将
a
转换为int
**将解决此问题rhfm7lfc3#
因为
4294967282>6
为true,所以输出为>6
。4294967282
来自将-14
分配给unsigned int
。(a+b)
将被转换为2^32 - 14
。`ct2axkht4#
代码的简单形式如下:
输出将是: