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的回答,很有帮助!
整数提升规则,正确引用 C11 6.3.1.1:
如果 an
int可以表示原始类型的所有值(受宽度限制,对于位域),则将该值转换为int; 否则,它被转换为unsigned int。这些被称为整数提升。整数提升不会改变所有其他类型。
其中“否则,它被转换为无符号整数”实际上仅用于一种特殊情况,即较小的整数类型unsigned short与unsigned 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。
| 归档时间: |
|
| 查看次数: |
3833 次 |
| 最近记录: |