在 16 位字長機器上,基本整型佔 2 位元組。超出範圍時需用長整型(L/l)或無符號型(U/u)。前綴與後綴可同時使用:
158L // 十進制長整數
012L // 八進制長整數 (10)
0X15L // 十六進制長整數 (21)
358u // 無符號整數
0XA5Lu // 十六進制無符號長整數 A5 (165)
| 類別 | 類型聲明符 | 位元組 | 範圍 |
|---|---|---|---|
| 基本型 | int | 2 | -32768~32767 |
| 短整型 | short int / short | 2 | -32768~32767 |
| 長整型 | long int / long | 4 | -2147483648~2147483647 |
| 無符號基本型 | unsigned int / unsigned | 2 | 0~65535 |
| 無符號短整型 | unsigned short | 2 | 0~65535 |
| 無符號長整型 | unsigned long | 4 | 0~4294967295 |
不同類型的量可參與運算並相互賦值,編譯系統自動完成類型轉換。規則遵循「向較高精度/較大範圍類型提升」。
void main() {
long x=5, y=6;
int a=7, b=8, c, d;
c = x + a; // long + int → long 運算,結果賦給 int c(截斷)
d = y + b;
printf("c=%d, d=%d", c, d);
}
輸出:c=12, d=14。雖然運算過程提升為 long,但最終賦值給 int 變數時會截斷高位(若超出 int 範圍則溢位)。
[Practice] //1
int a,b; short int c; short d=100;
a=d-20; // a=80
b=a+d; // b=180
c=a+b+d; // c=360
d=d-a+c-b; // d=200
[Practice] //2
int a=5, b=9; long int c; long d;
c=a+b-7; // c=7
d=a*b*c; // d=315
c=d*d*d; // c=31255875 (超出 int 範圍,但 c 是 long)
a=c-d; // a=-5112 (截斷)
[Practice] //3
int a=6, b=19; unsigned int c; int d;
c=a-b+7; // c=65530 (無符號環繞: -6+7=1? 實際 6-19=-13, -13+7=-6 → 65530)
d=b*c; // d=-114 (有符號解釋)
a=b+c+d; // a=-101
b=-a; // b=101
關鍵觀察: 無符號與有符號混合運算時,有符號轉為無符號參與運算,結果可能出乎意料。賦值給有符號變數時再按補碼解釋。