C代碼在遇到數據類型不一致的情況時,編譯器會進行自動數據類型提升。
自動轉換遵循以下規則:
- 如果兩種類型字節數不同,則轉換成字節數高的類型。
- 如果兩種類型字節數相同,但一種有符號,一種無符號,則轉換成無符號類型
- 所有浮點都是以雙精度類型進行的,即使只含有單精度運算的表達式,也要先轉換成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)。
