C语言 为什么输出此程序是的,而它应该抛出错误或否



这里的a + b是-14,它应该小于'a',因此应该打印NO,但它打印是。

unsigned int a = 6;
int b = -20;
if((a+b)  > a){
printf("Yes");
} else {
printf("NO");
}
return 1;

根据 C 标准(6.3.1.8 常用算术转换(

1 许多期望算术类型操作数的运算符导致 以类似的方式进行转化和收益结果类型。目的是 确定操作数和结果的通用实数类型。对于 指定的操作数,转换每个操作数,不更改类型 域,其对应的实数类型为公共实数的类型 类型。除非另有明确说明,否则常见的实数类型也是 结果的相应实际类型,其类型域为 操作数的类型域(如果它们相同且复杂( 否则。这种模式称为通常的算术转换

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

类型unsigned intint具有相同的等级。

因此,示例中b变量的值被解释为无符号值。

如果要在函数调用printf中对表达式( a + b )使用正确的转换说明符%u,则可能会得到

#include <stdio.h>
int main(void) 
{
unsigned int a = 6;
int b = -20;

printf( "a + b = %un", a + b );

return 0;
}

a + b = 4294967282

您将已签名与无符号进行比较。由于无符号的所有值都无法容纳在有符号中,因此有符号值将转换为无符号并且远大于 6

相关内容

最新更新