C 为什么该程序输出为是,而它应该抛出错误或否
这里a+b是-14,它应该小于“a”,因此应该打印“否”,但它打印“是”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需要算术类型操作数的许多运算符会导致 转换并以类似的方式生成结果类型。目的是 确定操作数和结果的通用实数类型。对于 指定的操作数,每个操作数都将转换,而不更
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