打印short、long、long long和unsigned類型

 

        打印unsigned int類型的值,使用%u轉換說明;打印long類型的值,使
用%ld轉換說明。如果系統中int和long的大小相同,使用%d就行。但是,這
樣的程序被移植到其他系統(int和long類型的大小不同)中會無法正常工
作。在x和o前面可以使用l前綴,%lx表示以十六進制格式打印long類型整
數,%lo表示以八進制格式打印long類型整數。注意,雖然C允許使用大寫或
小寫的常量後綴,但是在轉換說明中只能用小寫。

        C語言有多種printf()格式。對於short類型,可以使用h前綴。%hd表示以
十進制顯示short類型的整數,%ho表示以八進制顯示short類型的整數。h和l
前綴都可以和u一起使用,用於表示無符號類型。例如,%lu表示打印
unsigned long類型的值。程序清單3.4演示了一些例子。對於支持long long類
型的系統,%lld和%llu分別表示有符號和無符號類型。


#include <stdio.h>
int main(void)
{
unsigned int un = 3000000000; /* int爲32位和short爲16位的系統 */
short end = 200;
long big = 65537;
long long verybig = 12345678908642;
printf("un = %u and not %d\n", un, un);
printf("end = %hd and %d\n", end, end);
printf("big = %ld and not %hd\n", big, big);
printf("verybig= %lld and not %ld\n", verybig, verybig);
return 0;
}
在特定的系統中輸出如下(輸出的結果可能不同):
un = 3000000000 and not -1294967296
end = 200 and 200
big = 65537 and not 1
130
verybig= 12345678908642 and not 1942899938

        該例表明,使用錯誤的轉換說明會得到意想不到的結果。第 1 行輸出,
對於無符號變量 un,使用%d會生成負值!其原因是,無符號值 3000000000
和有符號值−129496296 在系統內存中的內部表示完全相同(詳見第15
章)。因此,如果告訴printf()該數是無符號數,它打印一個值;如果告訴它
該數是有符號數,它將打印另一個值。在待打印的值大於有符號值的最大值
時,會發生這種情況。對於較小的正數(如96),有符號和無符號類型的存
儲、顯示都相同。

         第2行輸出,對於short類型的變量end,在printf()中無論指定以short類型
(%hd)還是int類型(%d)打印,打印出來的值都相同。這是因爲在給函
數傳遞參數時,C編譯器把short類型的值自動轉換成int類型的值。你可能會
提出疑問:爲什麼要進行轉換?h修飾符有什麼用?第1個問題的答案是,
int類型被認爲是計算機處理整數類型時最高效的類型。因此,在short和int類
型的大小不同的計算機中,用int類型的參數傳遞速度更快。第2個問題的答
案是,使用h修飾符可以顯示較大整數被截斷成 short 類型值的情況。第 3 行
輸出就演示了這種情況。把 65537 以二進制格式寫成一個 32 位數是
00000000000000010000000000000001。使用%hd,printf()只會查看後 16
位,所以顯示的值是 1。與此類似,輸出的最後一行先顯示了verybig的完整
值,然後由於使用了%ld,printf()只顯示了儲存在後32位的值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章