如果我们有
int a = 1;
unsigned int b = -1;
表达的类型是什么
a + b;
我可以使用 int 来存储结果吗?
有一组规则称为通常的算术转换,用于指定使用算术运算符时应用的转换。(如果您在此处搜索该术语,您将轻松找到完整列表)
在这种情况下,int
被提升为unsigned int
,保留1
的值,因此加法的结果被明确定义为(unsigned int)0
。
由于此值不大于 INT_MAX
,因此可以将其存储在int
中。
对于您的代码,"通常的算术转换"规则将适用于+
运算符的操作数,因此,在
a + b;
根据整数升级规则,a
将在添加之前提升为unsigned int
。结果也将是类型 unsigned int
。
引用C11
标准,第 §6.3.1.8 章
..[..]...否则,如果具有无符号整数类型的操作数的秩大于或 等于另一个操作数类型的秩,然后操作数与 有符号整数类型转换为带无符号的操作数的类型 整数类型。
的类型
a + b;
将unsigned int
根据C标准)6.3.1.8 常用算术转换)
至于将无符号类型的对象2...否则,两个操作数都将转换为与具有有符号整数类型的操作数的类型相对应的无符号整数类型
分配给与您的示例中具有相同等级的有符号类型的对象(C 标准,6.3.1.3 有符号和无符号整数)id 有符号整数类型的对象不能表示无符号整数类型的对象的值,那么
3 否则,新类型是有符号的,并且值不能 在其中代表;结果要么是实现定义的,要么是 实现定义的信号被抛出
如果该值可以由签名对象表示,则它不会原封不动地存储在签名对象中。