在C语言中的有符号整数

3
#include<stdio.h>

int main()
{
    unsigned int a=6;
    int b=-20;
    (a+b>6)?puts(">6"):puts("<=6");
    return 0;
}

上面的代码输出结果为>6。但是我有一个疑问,b=-20会得到一个负数值(-18), 因为它是一个带符号的整数,做2的补码运算后应该输出<=6,但实际上它给出的输出是>6

4
请注意,使用 ?: 条件调用函数被认为是不良实践。 - Oliver Charlesworth
@Iron: 因为 ?: 是一个运算符,所以这个语句是一个表达式并且有一个值(在这里被丢弃了)。它不等同于 if-else。 - Clifford
3个回答

9
根据C99标准第6.3.1.8节("通常的算术转换"):

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

基本上,在您的示例代码中,unsigned intint具有相同的等级,因此它等效于:
(a + (unsigned int)b > 6)

要解决这个问题,你需要明确地进行另一方向的转换,即:

需要进行显式类型转换,例如:

((int)a + b > 6)

1
你在代码中混用了有符号整数和无符号整数。这是一件不好的事情。请尝试以下代码片段:
int main()
{
    unsigned int a = 0;
    int b=-20;
    printf("(a + b) = %f", (a + b));
    return 0;
}

不要混合使用有符号和无符号整数,因为编译器会在你不希望的时候进行静默转换。


1

答案可以在C99标准的“6.3.1.8通常算术转换”一节中找到,该节在二元运算符传递有符号类型和无符号类型时更倾向于无符号类型(实际情况比这复杂得多)。

请参阅此博客文章,了解在6.3.1.8规则中工作的另一个示例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接