整型提升是C程式設計語言中的一項規定:在表達式計算時,各種整形首先要提升為int類型,如果int類型不足以表示則要提升為unsigned int類型;然後執行表達式的運算。
基本介紹
- 中文名:整型提升
- 性質:是C程式設計語言中的一項規定
- 領域:計算機
- 目的:表達計算
簡介,C語言,
簡介
"A character, a short integer, or an integer bit-field, all either signed or not, or an object of enumeration type, may be used in an expression wherever an integer maybe used. If an int can represent all the values of the original type, then the value is converted to int; otherwise the value is converted to unsigned int. This process is called integral promotion."
這段話的大意是:表達式中可以使用整數的地方,就可以使用枚舉類型,或有符號或無符號的字元、短整數、整數位域。如果一個int可以表示上述類型,則該值被轉化為int類型的值;否則,該值被轉化為unsigned int類型的值。這一過程被稱作integral promotion。
整型提升的意義在於:表達式的整型運算要在CPU的相應運算器件內執行,CPU內整型運算器(ALU)的運算元的位元組長度一般就是int的位元組長度,同時也是CPU的通用暫存器的長度。因此,即使兩個char類型的相加,在CPU執行時實際上也要先轉換為CPU內整型運算元的標準長度。通用CPU(general-purpose CPU)是難以直接實現兩個8比特位元組直接相加運算(雖然機器指令中可能有這種位元組相加指令)。所以,表達式中各種長度可能小於int長度的整型值,都必須先轉換為int或unsigned int,然後才能送入CPU去執行運算。
C語言標準中僅規定了:
char的長度 ≤ short int的長度 ≤ int的長度
這意味著short int與int的長度相等的可能。這種情形下,unsigned short就無法提升為int表示,只能提升為unsigned int。
示例程式如下:
#include <stdio.h>int main(){ char a = 0xb6; short b = 0xb600; int c = 0xb6000000; if ( a == 0xb6) printf("a"); if ( b == 0xb600) printf("b"); if ( c == 0xb6000000) printf("c"); }
在x86架構上的Visual C++或gcc編譯下,上述程式輸出為 c 。這是因為在這些環境下,編譯器把char定義為signed char(C語言標準沒有規定char類型是有符號還是無符號);表達式a==0xb6被整型提升,其中char類型的a提升為int類型並為一個負值,因此這個表達式的結果為false;表達式b==0xb600被整型提升,其中short類型的b提升為int類型並為一個負值,因此這個表達式的結果為false;表達式c == 0xb6000000沒有做整型提升,==運算符的兩段都是int類型的負值,其結果為true。
C語言的單運算元的+運算符(即“前綴+”),一個主要作用就是實現對運算元的整型提升。例如:
#include <stdio.h>int main(){ char a = 1; printf("%u", sizeof(a) ); printf("\n"); printf("%u", sizeof( +a ) ); }
在x86的32位gcc編譯後,輸出為:
14