C 語言基礎(chǔ)教程(我的C之旅開始了)[五]
12. 基本數(shù)據(jù)類型:整型(下)
1. 輸出各種整數(shù)類型的變量 輸出不同類型的整數(shù),需要使用不用的格式限定符。輸出 unsigned int 類型的整數(shù),要用 %u 。輸出 long ,要用 %ld;如果要以十六進(jìn)制或者八進(jìn)制形式輸出,那就用 %lx(或者%lX)或者 %lo。注意:雖然整數(shù)常量的后綴使用大寫或者小寫英文字母都沒關(guān)系,但是它們格式限定符必須使用小寫!如果我們要輸出 short 類型的整數(shù),可以在 %d 中間加上前綴 h,也就是%hd;同理,%ho 和 %hx(或者 %hX )分別表示以八進(jìn)制或十六進(jìn)制形式輸出。前綴 h 和 l 可以和 u 組合,表示輸出無符號整數(shù)。例如:%lu 表示輸出 unsigned long 類型的整數(shù);%hu 表示輸出unsigned short類型的整數(shù)。如果您的編譯器支持C99,可以使用 %lld 和 %llu 分別表示輸出 long long 和 unsigned long long 。下面我們來看一個輸出各種類型整數(shù)的程序: #include <stdio.h> int main(void) printf("un = %u and not %d\n", un, un); printf("Press ENTER to quit..."); 使用 Dev-C++ 編譯運行這個程序輸出結(jié)果如下: un = 3000000000 and not -1294967296 這個程序表明,錯誤使用格式限定符會導(dǎo)致意想不到的輸出。首先,錯誤使用 %d 來做無符號整型變量 un 的格式限定符,導(dǎo)致輸出的是負(fù)數(shù)。這是因為我的計算機使用相同的二進(jìn)制形式來表示 3000000000 和 -129496296 ,而計算機只認(rèn)識二進(jìn)制。所以,如果我們使用 %u 告訴 printf 輸出無符號整數(shù),輸出的就是 3000000000;如果我們誤用了 %d,那么輸出的就是一個負(fù)數(shù)。不過,如果我們把代碼中的 3000000000 改成 96 的話,輸出就不會出現(xiàn)異常。因為 96 沒有超出 int 的表示范圍。 首先請看以下程序: #include <stdio.h> int main(void) printf("%d %d %d %d\n", i, i+1, j, j-1); printf("Press ENTER to quit..."); 使用 Dev-C++ 編譯運行這個程序輸出結(jié)果如下: 2147483647 -2147483648 -2147483648 2147483647 這個程序中,i+1 是負(fù)數(shù),j-1 是正數(shù),k+1 是 0,l-1 是 4294967295 。這是因為加減運算過后,它們的值超出了它們對應(yīng)的那種整數(shù)類型的表示范圍,我們把這種現(xiàn)象稱為溢出。 1. 長度限制 C89 規(guī)定,編譯器至少應(yīng)該能夠處理 31 個字符(包括 31)以內(nèi)的內(nèi)部標(biāo)識符(internal identifier);而對于外部標(biāo)識符(external identifier),編譯器至少應(yīng)該能夠處理 6 個字符(包括 6)以內(nèi)的外部標(biāo)識符。所謂標(biāo)識符,是指我們?yōu)樽兞浚╲ariable)、宏(macro),或者函數(shù)(function)等等取的名字。例如 int num; 這個語句中的 num 就是一個標(biāo)識符。 標(biāo)準(zhǔn)規(guī)定,標(biāo)識符只能由大小寫英文字母,下劃線(_),以及阿拉伯?dāng)?shù)字組成。標(biāo)識符的第一個字符必須是大小寫英文字母或者下劃線,而不能是數(shù)字。 合法命名 非法命名 操作系統(tǒng)和 C 語言標(biāo)準(zhǔn)庫里的標(biāo)識符一般以下劃線開頭,這是約定俗成的。因此,我們應(yīng)該避免使用下劃線作為我們自己定義的標(biāo)識符的開頭。
{
unsigned int un = 3000000000; /* 我使用的編譯器 int 是 32 位的 */
short end = 200; /* 而 short 是 16 位的 */
long big = 65537;
printf("end = %hd and %d\n", end, end);
printf("big = %ld and not %hd\n", big, big);
getchar();
return 0;
}
end = 200 and 200
big = 65537 and not 1
Press ENTER to quit...
然后,對于第二個 printf,無論我們使用 %hd 還是 %d,輸出的結(jié)果都是一樣的。這是因為 C 語言標(biāo)準(zhǔn)規(guī)定,當(dāng) short 類型值傳遞給函數(shù)時,要自動轉(zhuǎn)化成 int 類型值。之所以轉(zhuǎn)化成 int,是因為 int 被設(shè)計為計算機處理效率最高的整數(shù)類型。所以,對于 short 和 int 大小不同的計算機來說,把變量 end 轉(zhuǎn)化成 int 類型再傳遞給函數(shù),速度更快。如此說來,h 好像沒有存在意義。其實不然。我們可以用 %hd 來看看較大的整數(shù)類型被截斷成 short 類型的時候會是什么樣的。
而第三個printf,由于誤用%hd,導(dǎo)致輸出是1。這是因為,如果long是32位的話,65537的二進(jìn)制形式便是 0000 0000 0000 0001 0000 0000 0000 0001,而 %hd 命令 printf 輸出 short 類型的值,從而導(dǎo)致 printf 只對后 16 位進(jìn)行處理,最終導(dǎo)致輸出 1。
在前面的教程里,我們說過,保證格式限定符的數(shù)目和參數(shù)數(shù)目一致是我們的責(zé)任。同樣,保證格式限定符的類型和參數(shù)類型一致也是我們的責(zé)任!正如上面所說的那樣,錯誤使用格式限定符會導(dǎo)致意想不到的輸出!
2. 整數(shù)溢出
{
/* 32 位 int 表示范圍的上限和下限 */
int i = 2147483647, j = -2147483648;
unsigned int k = 4294967295, l = 0;
printf("%u %u %u %u %u\n", k, k+1, k+2, l, l-1);
getchar();
return 0;
}
4294967295 0 1 0 4294967295
Press ENTER to quit...
unsigned int 型變量的值如果超過了上限,就會返回 0,然后從 0 開始增大。如果小于 0,那么就會到達(dá) unsigned 型的上限,然后從上限開始減小。就好像一個人繞著跑道跑步一樣,繞了一圈,又返回出發(fā)點。int 型變量溢出的話,會變成負(fù)數(shù),或者正數(shù)。
對于 unsigned 類型的整數(shù),它們溢出時的情況一定和上面描述的一樣,這是標(biāo)準(zhǔn)規(guī)定的。但是標(biāo)準(zhǔn)并沒有規(guī)定有符號整數(shù)溢出時會出現(xiàn)什么情況。這里描述的有符號整數(shù)溢出時出現(xiàn)的情況是最常見的,但是在別的計算機,使用別的編譯器,也可能出現(xiàn)不同的情況。
13. 標(biāo)識符命名規(guī)則
最新的 C99 標(biāo)準(zhǔn)規(guī)定,編譯器至少應(yīng)該能夠處理 63 個字符(包括 63)以內(nèi)的內(nèi)部標(biāo)識符;編譯器至少應(yīng)該能夠處理 31 個字符(包括 31)以內(nèi)的外部標(biāo)識符。
事實上,我們可以使用超出最大數(shù)目限制的字符來命名標(biāo)識符,不過編譯器會忽略超出的那部分字符。也就是說,如果我們用 35 個字符來命名變量,而那個編譯器最多只能處理 31 個字符的變量名的話,那么多出的那 4 個字符就會被編譯器忽略,只有前面的 31 個字符有效。有些古老的編譯器只能處理 8 個字符以內(nèi)的標(biāo)識符,對于這樣的編譯器來說,標(biāo)識符 kamehameha 和 kamehameko 是等價的,因為它們前面 8 個字符相等。
2. 可用字符和組合規(guī)則
wiggles $Z]** /* $、] 和 * 都是非法字符 */
cat2 2cat /* 不能以數(shù)字開頭 */
Hot_Tub Hot-Tub /* - 是非法字符 */
taxRate tax rate /* 不能有空格 */
_kcab don't /* ' 是非法字符 */
C 語言是大小寫敏感的語言,也就是說,star、Star、sTar,stAr 和 STAR 等都是相互不同的標(biāo)識符。
我們不能用關(guān)鍵字和保留標(biāo)識符來給我們自定義的變量命名。關(guān)于關(guān)鍵字和保留標(biāo)識符,請點擊 關(guān)鍵字和保留標(biāo)識符
相關(guān)文章
C語言鏈表案例學(xué)習(xí)之通訊錄的實現(xiàn)
為了將所學(xué)到的鏈表的知識進(jìn)行鞏固學(xué)習(xí),做到學(xué)以致用,本文將利用鏈表制作一個簡單的通訊錄。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-10-10C語言類型轉(zhuǎn)換與常量的細(xì)節(jié)深入理解探究
這篇文章主要為大家介紹了C?語言類型轉(zhuǎn)換與常量的細(xì)節(jié)深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12Win11+?VS2022編譯?FFmpeg6.0?靜態(tài)庫的詳細(xì)過程
這篇文章主要介紹了Win11+VS2022編譯FFmpeg6.0靜態(tài)庫的方法,本文通過圖文實例代碼相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-08-08