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