无符号整型变量转换为有符号整型变量

3
为什么以下程序会输出b大于a? 尽管b的值为-2。
void main()
{
    unsigned int a=12;
    int b=-2;

    if(a>b)
        printf("a is greater");
    else
        printf("b is greater");

    getch();
}

你能澄清一下你的问题吗?为什么你不认为12 > -2呢? - michaelrccurtis
嗯,数学证明了你的结果。 - Jonathon Reinhart
请查看通常的算术转换 - Missu
转换是相反的:有符号 - > 无符号。 - molbdnilo
可能重复问题的链接:有符号整数 versus 无符号整数 - John Bollinger
4个回答

1
首先,引用关系运算符的C11标准,第6.5.8章节:
如果两个操作数都具有算术类型,则执行通常的算术转换。
现在,根据第6.3.1.8章节中的描述,即“通常的算术转换”,如果您尝试在一个“signed”和一个“unsigned”整数(类型)之间执行算术运算,那么“signed”将被提升为“unsigned”类型(更高级别),然后进行操作。
因此,在这里,为了进行比较,“b”的值被转换为“unsigned”类型,导致输出结果错误。
引用同一章节中相关部分:
否则,两个操作数都将转换为与带有有符号整数类型的操作数相对应的无符号整数类型。
您也可以检查常规算术提升规则 在此处

话虽如此,void main() 应该改为 int main(int argc, char* argv[]),或者至少是 int main(void)


比较不是一种算术运算。 - Psytho
如果两个操作数都具有算术类型,则执行通常的算术转换。 - Sourav Ghosh
@Alex.S 比较不是算术运算吗? - chux - Reinstate Monica
@chux 因为比较不是一种算术运算。https://zh.wikipedia.org/wiki/%E7%AE%97%E6%9C%AF - Psytho
@Alex.S 冒着被误解为 鸭子/兔子狩猎 的风险,像 a>b 这样的比较是通过减法来进行的,这是一种确定的算术运算。 - chux - Reinstate Monica

0

为了进行比较,首先将两个操作数转换为相同的类型。在这种情况下,int b 被转换为更高级别的 unsigned。对于比较值,它是 12 > (-2 + (UINTMAX + 1)) 吗?答案是假。

要按照通常的数学意义进行比较:

unsigned int a;
int b;

if ((b < 0) || (a > b)) printf("a is greater");

0
这是类型提升规则之一:如果一个参数是 int 类型,另一个参数是 unsigned int 类型,则将 int 提升为 unsigned int,必要时加上 UINT_MAX + 1。
在比较之前会发生这种情况。

0
 if(a>b)

在此代码中,a 是无符号整型,而b是有符号整型。因为隐式转换的原因,b将被转换为无符号整型,并且b将具有一个非常大的值(不用说,它将大于a)。

因此,您会得到意想不到的结果。

根据C99- 6.3.1.8通常算术转换规则:

[...]

3.否则,如果具有无符号整数类型的操作数的等级大于或等于其他操作数的类型的等级,则具有有符号整数类型的操作数将转换为具有无符号整数类型的操作数的类型。


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