C語言數據類型提升


C代碼在遇到數據類型不一致的情況時,編譯器會進行自動數據類型提升。

自動轉換遵循以下規則:

  1. 如果兩種類型字節數不同,則轉換成字節數高的類型。
  2. 如果兩種類型字節數相同,但一種有符號,一種無符號,則轉換成無符號類型
  3. 所有浮點都是以雙精度類型進行的,即使只含有單精度運算的表達式,也要先轉換成double型,再作運算。

如下圖所示:

一般情況下,自動數據類型提升不會引起代碼問題,但是需要特別注意的是uint和int類型比較語句時,可能會引起代碼邏輯問題。看如下例子:

int32_t  a = -1;
uint32_t b =  1;
if (a > b) {
  printf("a > b\n");
} else {`
  printf("a < b\n");
}

如果我們沒有注意到數據類型不一致,而寫出了類似上邊的代碼。由於編譯器的自動數據類型提升,代碼執行的時候,會將int32_t a轉換為uint32_t類型,導致判斷語句中"(uint32_t)a"會大於b,從而執行錯誤的代碼邏輯。(本意應該是a < b)

對於這種情況,一種方案是我們將數據類型定義一致;另一種方案是加顯示的數據類型轉換,如if(a > (int32_t)b)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM