C程序中的整数推广

时间:2016-07-07 10:39:21

标签: c integer-promotion

我编写了一个简单的C程序,想知道是否正在进行整数提升。

  

请解释整数推广如何发生以及如何避免?

/* start of main */

unsigned short int res;
unsigned short int bsp;
signed short int analog;

bsp = 2215;
analog = 2213;
if((signed short int)(bsp - analog) > 0){
    res = bsp - analog;
    printf("%d", res);
}
else{
    res = analog - bsp;
    printf("%d", res);
}

2 个答案:

答案 0 :(得分:2)

我要将此答案限制为int为32位,short为16位。

然后bsp - analogint类型的表达式。

如果无法在short中表示bsp - analog,则将此广告投放到short的行为是未定义的。因此请谨慎编写(signed short int)(bsp - analog)之类的代码。

res来电中int隐含地宣传printf

最后,避免不必要的促销活动的最佳方法是始终使用相同的类型。考虑在您的案例中使用intlong

答案 1 :(得分:2)

整数促销由程序中的两个不同来源发布:

  • 通常的算术转换(因为二进制-运算符 1
  • 默认参数促销(因为printf可变参数函数)

在这两种情况下,signed short int类型的参数都会提升为int,假设int范围可以包含以前类型可以容纳的每个数字。通常,它会以这种方式发生,因为shortint分别是16位和32位宽。

1)与>运算符一样好(如下面chux的comment中所述)。