簡體   English   中英

C程序中的整數推廣

[英]Integer promotion in C program

我寫了一個簡單的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);
}

我打算將這個答案限制為32位的intshort的16位。

然后bsp - analogint類型的表達式。

如果bsp - analog不能用short表示,那么將它轉換為short的行為是不確定的。 因此請謹慎編寫類似(signed short int)(bsp - analog)代碼。

printf調用中有一個隱式的res升級為int

最后,避免不必要的促銷活動的最佳方法是始終使用相同的類型。 在您的情況下考慮使用intlong

整數促銷由程序中的兩個不同來源發布:

  • 通常的算術轉換 (因為二進制-運算符1
  • 默認參數促銷 (因為printf variadic函數)

在這兩種情況下,將signed short int類型的參數提升為int ,假設, int范圍可以包含以前類型可以容納的每個數字。 通常,它以這種方式發生,因為shortint分別是16位和32位寬。


1)作為>運算符(如下面chux的評論中所述)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM