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

C 为什么该程序输出为是,而它应该抛出错误或否,c,types,integer,type-conversion,implicit-conversion,C,Types,Integer,Type Conversion,Implicit Conversion,这里a+b是-14,它应该小于“a”,因此应该打印“否”,但它打印“是” unsigned int a = 6; int b = -20; if((a+b) > a){ printf("Yes"); } else { printf("NO"); } return 1; 根据C标准(6.3.1.8常用算术转换) 1需要算术类型操作数的许多运算符会导致 转换并以类似的方式生成结果类型。目的是 确定操作数和结果的通用实数类型。对于 指定的操作数,每个操作数都将转换,而不更

这里a+b是-14,它应该小于“a”,因此应该打印“否”,但它打印“是”

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 int
int
具有相同的等级

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

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

#include <stdio.h>

int main(void) 
{
    unsigned int a = 6;
    int b = -20;
    
    printf( "a + b = %u\n", a + b );
    
    return 0;
}


a + b = 4294967282
#包括
内部主(空)
{
无符号整数a=6;
int b=-20;
printf(“a+b=%u\n”,a+b);
返回0;
}
a+b=4294967282

比较有符号和无符号。由于所有unsigned的值都不能包含在signed中,因此signed值被转换为unsigned,并且远大于6

为什么要指定a为unsigned int?你有必要这样做吗?很好地抓住了无符号int