這期內容當中小編將會給大家帶來有關C語言中有哪些類型,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
相比于高級語言,C語言的整型數據類型都有固定位寬,即類型占多少位。比如下面的數據類型:
signed char unsigned char signed short unsigned short signed int unsigned int signed long unsigned long signed long long unsigned long long
由于平臺的不同,這些類型的位寬可能有些不相同,但是可以確定的是,每個平臺都有固定的位寬。為了在編程過程中明確指定位寬,增加代碼的可讀性和避免對平臺依賴,各個平臺都定義了自己指定位寬的基本類型,如Linux平臺上在stdint.h
頭文件就定義了如下類型
int8_t uint8_t int16_t uint16_t int32_t uint32_t int64_t uint64_t
每個類型都指定了符號和位寬,從字面上就可以看到這個類型的位寬是多少。由于位寬的存在,導致每個類型都有自己的最大值和最小值,比如Linux又分別定義了每種類型的最大值和最小值(無符號數的最小值都是0)
INT8_MIN INT8_MAX INT16_MIN INT16_MAX INT32_MIN INT32_MAX INT64_MIN INT64_MAX UINT8_MAX UINT16_MAX UINT32_MAX UINT64_MAX
有了這些定義,C語言的運算基本都要都要這些邊界值,否則就會造成傳說中的整數溢出問題。如加法和乘法運算就要做如下判斷:
//計算兩個值的和 uint32_t sum(uint32_t a, uint32_t b) { /*先判斷加法以后是否會溢出 注意這里不能用 (a+b)<UINT32_MAX判斷,因為a+b已經溢出了,判斷已經沒有意義了*/ if ((UINT32_MAX - a) < b) { //error } return a + b; } //計算兩個值的乘積 uint32_t mul(uint32_t a, uint32_t b) { /*先判斷乘積以后是否會溢出 注意這里不能用 (a*b)<UINT32_MAX判斷,因為a*b已經溢出了,判斷已經沒有意義了*/ if ((UINT32_MAX / a) < b) { //error } return a * b }
C語言的整型數據類型都包含符號修飾符:signed
(有符號)或者unsigned
(無符號),但是符號修飾符并不影響數據真實的值,比如我們定義如下值:
signed char a = -1 unsigned char b = (signed char)a;
從內存的內容來講,a的內存和b的內存是一致的,都是11111111
,沒什么區別,但是符號修飾符會影響邏輯判斷的結果,比如雖然這兩個值在內存上沒什么區別,但是如果下比較會返回相反的結果:
signed char a = -1 unsigned char b = (signed char)a; //成立 if (a < 0) { printf("a < 0\n"); } //成立 if (b > 0) { printf("b > 0\n"); }
除了符號會影響邏輯判斷之外,C語言的默認轉換也會影響邏輯判斷的結果,如下面的比較在不同的情況下,結果就不同
signed char a = -1 unsigned char b = (signed char)a; //不成立,a沒有轉換為`unsigned char` if (a > (unsigned char)0) { printf("unsigned char a > 0\n"); } //不成立,a沒有轉換為`unsigned short` if (a > (unsigned short)0) { printf("unsigned char a > 0\n"); } //成立,a轉換為`unsigned int` if (a > (unsigned int)0) { printf("unsigned int a > 0\n"); }
上述就是小編為大家分享的C語言中有哪些類型了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。