出自《C 專家編程》的經典範例:
#include <stdio.h>
int array[] = {23, 34, 12, 17, 204, 99, 16};
#define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))
int main(void) {
int d = -1, x;
if (d <= TOTAL_ELEMENTS - 2)
x = array[d + 1]; // 這行永遠不會執行!
return 0;
}
明明 d = -1,TOTAL_ELEMENTS = 7,-1 <= 5 應為真,為何進不去?
sizeof 回傳 size_t(無號整數)TOTAL_ELEMENTS 為 unsigned intd 為 signed intd 隱式轉為 unsigned int,-1 變成極大正數(0xFFFFFFFF)char、short → int;float → doubledouble > long > unsigned > intchar、short、位段 → int 或 unsigned int(視範圍而定)unsigned long vs 其他 → 都轉 unsigned longlong vs unsigned int:若 long 能容納 unsigned int 則轉 long,否則轉 unsigned longunsigned int vs int → 轉 unsigned int假設 int 16 位元,long 32 位元:
-1L < 1U:1U 轉 signed long,比較為真-1L > 1UL:-1L 轉 unsigned long 變極大,比較為真(int)sizeof(...)-Wsign-compare)static_assert 或概念檢查「類型轉換帶來的 bug 往往難以直接調試出來,稍不注意可能對整個專案造成無法預測的後果。」