c中的整数提升

Mon*_*nir 1 c integer-overflow integer-promotion

假设我有一台 32 位机器。

我知道在整数提升期间,表达式被转换为:\

  • int 如果原始类型的所有值都可以用 int 表示
  • unsigned 除此以外

你能解释一下下面的表达式会发生什么吗?总的来说,这里的排名是如何工作的?

第一个片段:

si16  x, pt;
si32  speed;
u16 length;
x = (speed*pt)/length;
Run Code Online (Sandbox Code Playgroud)

第二个:

x = pt + length;
Run Code Online (Sandbox Code Playgroud)

编辑:

si16均值signed short(大小 16 位)、si32位均值signed int(大小 32 位)和u16均值unsigned short(大小 16)

我发现以下链接非常清楚地描述了这个问题: 隐式类型转换

具体看Lundin的回答,很有帮助!

Lun*_*din 5

整数提升规则,正确引用 C11 6.3.1.1:

如果 anint可以表示原始类型的所有值(受宽度限制,对于位域),则将该值转换为int; 否则,它被转换为unsigned int。这些被称为整数提升。整数提升不会改变所有其他类型。

其中“否则,它被转换为无符号整数”实际上仅用于一种特殊情况,即较小的整数类型unsigned shortunsigned int. 在这种情况下,它将保持未签名。

除了这种特殊情况,所有小整数类型总是会被提升为(有符号的),int而不管它们的符号如何。


假设 32 位int,则:

 x = (speed*pt)/length;
Run Code Online (Sandbox Code Playgroud)

speed签名为 32,将不会得到提升。ptr将被提升为整数int(签名为 32)。的结果speed*ptr将有类型int

length将整数提升为int. 除法将使用类型的操作数进行int,结果类型将为int.

结果将被转换为有符号的 16,因为它被分配给x(赋值期间的左值转换)。

x = pt + length;类似,这里 + 的两个操作数都会int在加法之前被提升,然后结果将被转换为有符号 16。