C程序中的整数提升

C程序中的整数提升,c,integer-promotion,C,Integer Promotion,我写了一个简单的C程序,想知道是否整数升级正在发生 请解释整数提升是如何发生的,以及如何避免它 我将把这个答案限制为int为32位,而short为16位 然后,bsp-analog是类型为int的表达式 如果bsp-analog不能在short中表示,则将其转换为short的行为未定义。因此,编写类似于(有符号短int)(bsp-模拟)的代码时要小心 在printf调用中,res被隐式提升为int 最后,避免不必要的促销的最好方法是在整个过程中使用相同的类型。在您的案例中考虑使用 int >代码

我写了一个简单的C程序,想知道是否整数升级正在发生

请解释整数提升是如何发生的,以及如何避免它


我将把这个答案限制为
int
为32位,而
short
为16位

然后,
bsp-analog
是类型为
int
的表达式

如果
bsp-analog
不能在
short
中表示,则将其转换为
short
的行为未定义。因此,编写类似于
(有符号短int)(bsp-模拟)
的代码时要小心

printf
调用中,
res
被隐式提升为
int


最后,避免不必要的促销的最好方法是在整个过程中使用相同的类型。在您的案例中考虑使用<代码> int >代码>或<代码>长< />代码。

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

  • 常用的算术转换(由于二进制
    -
    运算符1)
  • 默认参数升级(因为
    printf
    可变函数)
在这两种情况下,
带符号短int
类型的任一参数都会提升为
int
,假设
int
范围可以容纳前一种类型可以容纳的每个数字。通常,当
short
int
分别为16位和32位宽时,会出现这种情况



1) 以及
操作符(如下面的chux所述)。

提示:
printf(“%d”,res)
-->看那里…@Ravi关于整数提升,请看Sourav说了什么,但是我有一个疑问:你不是说“整数提升”而是指“通常的算术转换”?
bsp-analog
analog-bsp
都会导致提升。@AdrianoRepetti
。。。否则,将对两个操作数执行整数升级(§6.3.1.8)@Adriano Repetti。你在无谓地吹毛求疵。根据C标准,从
signed
unsigned
的转换被描述为一个整体提升。NMDV,但是
最后,为了避免在printf调用中将res隐式提升为int,请使用%hu作为格式化程序。
可能不是要使用的正确单词。注意,“参数将根据整数升迁进行升迁,但其值应在打印前转换为短整型或无符号短整型);因此,实际上,您从未停止升级。@Bathsheba不是“实现定义的”而不是“未定义的行为”?由于
比较,通常会发生算术转换。
/* 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);
}