c - 如何根据操作数类型确定结果的类型



如果我们有

   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 否则,新类型是有符号的,并且值不能 在其中代表;结果要么是实现定义的,要么是 实现定义的信号被抛出

如果该值可以由签名对象表示,则它不会原封不动地存储在签名对象中。

相关内容

  • 没有找到相关文章

最新更新