国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
整型變量的輸出及溢出|C語(yǔ)言學(xué)習(xí)

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 組合,表示輸出無(wú)符號(hào)整數(shù)。例如:%lu 表示輸出 unsigned long 類型的整數(shù);%hu 表示輸出unsigned short類型的整數(shù)。如果您的編譯器支持C99,可以使用 %lld 和 %llu 分別表示輸出 long long 和 unsigned long long 。下面我們來(lái)看一個(gè)輸出各種類型整數(shù)的程序:

        #include <stdio.h>

        int main(void)

        {

unsigned int un = 3000000000; /* 我使用的編譯器 int 是 32 位的 */

short end = 200; /* 而 short 是 16 位的 */

long big = 65537;

printf("un = %u and not %d
", un, un);

printf("end = %hd and %d
", end, end);

printf("big = %ld and not %hd
", big, big);

printf("Press ENTER to quit...");

getchar();

return 0;

        }

使用 Dev-C++ 編譯運(yùn)行這個(gè)程序輸出結(jié)果如下:

        un = 3000000000 and not -1294967296

        end = 200 and 200

        big = 65537 and not 1

        Press ENTER to quit...

    這個(gè)程序表明,錯(cuò)誤使用格式限定符會(huì)導(dǎo)致意想不到的輸出。首先,錯(cuò)誤使用 %d 來(lái)做無(wú)符號(hào)整型變量 un 的格式限定符,導(dǎo)致輸出的是負(fù)數(shù)。這是因?yàn)槲业挠?jì)算機(jī)使用相同的二進(jìn)制形式來(lái)表示 3000000000 和 -129496296 ,而計(jì)算機(jī)只認(rèn)識(shí)二進(jìn)制。所以,如果我們使用 %u 告訴 printf 輸出無(wú)符號(hào)整數(shù),輸出的就是 3000000000;如果我們誤用了 %d,那么輸出的就是一個(gè)負(fù)數(shù)。不過(guò),如果我們把代碼中的 3000000000 改成 96 的話,輸出就不會(huì)出現(xiàn)異常。因?yàn)?96 沒有超出 int 的表示范圍。

    然后,對(duì)于第二個(gè) printf,無(wú)論我們使用 %hd 還是 %d,輸出的結(jié)果都是一樣的。這是因?yàn)?C 語(yǔ)言標(biāo)準(zhǔn)規(guī)定,當(dāng) short 類型值傳遞給函數(shù)時(shí),要自動(dòng)轉(zhuǎn)化成 int 類型值。之所以轉(zhuǎn)化成 int,是因?yàn)?int 被設(shè)計(jì)為計(jì)算機(jī)處理效率最高的整數(shù)類型。所以,對(duì)于 short 和 int 大小不同的計(jì)算機(jī)來(lái)說(shuō),把變量 end 轉(zhuǎn)化成 int 類型再傳遞給函數(shù),速度更快。如此說(shuō)來(lái),h 好像沒有存在意義。其實(shí)不然。我們可以用 %hd 來(lái)看看較大的整數(shù)類型被截?cái)喑?short 類型的時(shí)候會(huì)是什么樣的。

而第三個(gè) printf,由于誤用 %hd,導(dǎo)致輸出是 1。這是因?yàn)?,如?long 是 32 位的話,65537 的二進(jìn)制形式便是 0000 0000 0000 0001 0000 0000 0000 0001,而 %hd 命令 printf 輸出 short 類型的值,從而導(dǎo)致 printf 只處理 16 位數(shù)據(jù)(假設(shè) short 是 16 位的),最終導(dǎo)致輸出 1。

    在前面的教程里,我們說(shuō)過(guò),保證格式限定符的數(shù)目和參數(shù)數(shù)目一致是我們的責(zé)任。同樣,保證格式限定符的類型和參數(shù)類型一致也是我們的責(zé)任!正如上面所說(shuō)的那樣,錯(cuò)誤使用格式限定符會(huì)導(dǎo)致意想不到的輸出!標(biāo)準(zhǔn)規(guī)定,如果任意參數(shù)和與其對(duì)應(yīng)的格式限定符類型不一致,則 printf 的行為是未定義的;如果格式限定符本身就是非法的,則 printf 的行為也是未定義的。

 

2. 整數(shù)溢出

    首先請(qǐng)看以下程序:

#include <stdio.h>

int main(void)

{

/* 32 位 int 表示范圍的上限和下限 */

int i = 2147483647, j = -2147483648;

unsigned int k = 4294967295, l = 0;

printf("%d %d %d %d
", i, i+1, j, j-1);

printf("%u %u %u %u %u
", k, k+1, k+2, l, l-1);

printf("Press ENTER to quit...");

getchar();

return 0;

}

使用 Dev-C++ 編譯運(yùn)行這個(gè)程序輸出結(jié)果如下:

 2147483647 -2147483648 -2147483648 2147483647

4294967295 0 1 0 4294967295

Press ENTER to quit...

    本例中,i+1 是負(fù)數(shù),j-1 是正數(shù),k+1 是 0,l-1 是 4294967295 。這是因?yàn)榧訙p運(yùn)算過(guò)后,它們的值超出了它們對(duì)應(yīng)的那種整數(shù)類型的表示范圍,我們把這種現(xiàn)象稱為溢出。

unsigned int 型變量的值如果超過(guò)了上限,就會(huì)返回 0,然后從 0 開始增大。如果低于下限,那么就會(huì)到達(dá) unsigned 型的上限,然后從上限開始減小。就好像一個(gè)人繞著跑道跑步一樣,繞了一圈,又返回出發(fā)點(diǎn)。一般,int 型變量溢出的話,會(huì)變成負(fù)數(shù),或者正數(shù)。

    對(duì)于 unsigned 類型的整數(shù),它們溢出時(shí)的情況一定和上面描述的一樣,這是標(biāo)準(zhǔn)規(guī)定的。但是標(biāo)準(zhǔn)并沒有規(guī)定有符號(hào)整數(shù)溢出時(shí)會(huì)出現(xiàn)什么情況。這里描述的有符號(hào)整數(shù)溢出時(shí)出現(xiàn)的情況是最常見的,但是在別的計(jì)算機(jī),使用別的編譯器,也可能出現(xiàn)不同的情況。


Reference URL:http://www.dz3w.com/mcu/clanguage/2480_3.html

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
C語(yǔ)言基本數(shù)據(jù)類型:整型(int)用法詳解
C++ 修飾符類型
原碼,反碼,補(bǔ)碼[轉(zhuǎn)
64位有符號(hào)與無(wú)符號(hào)類型的整數(shù)
C語(yǔ)言基本數(shù)據(jù)類型詳解
C語(yǔ)言基礎(chǔ)學(xué)習(xí)—數(shù)據(jù)類型與運(yùn)算符
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服