我們?cè)?C 語(yǔ)言中經(jīng)常會(huì)見(jiàn)到 unsigned 關(guān)鍵字,那么這是什么意思呢?在計(jì)算機(jī)內(nèi),數(shù)據(jù)類型分為有符號(hào)和無(wú)符號(hào)兩種類型。它的最高位用于標(biāo)識(shí)數(shù)據(jù)的符號(hào):如果最高位為 1,表明這個(gè)數(shù)為負(fù)數(shù);如果是0的則表明這個(gè)數(shù)為正數(shù)。那么我們就來(lái)做個(gè)試驗(yàn)驗(yàn)證下,代碼如下所示:
創(chuàng)新互聯(lián)建站是專業(yè)的青島網(wǎng)站建設(shè)公司,青島接單;提供成都做網(wǎng)站、成都網(wǎng)站建設(shè)、成都外貿(mào)網(wǎng)站建設(shè),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行青島網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!#includeint main() { char c = -5; short s = 6; int i = -7; printf("c : %d\n", ( (c & 0x80) != 0 )); printf("s : %d\n", ( (s & 0x8000) != 0 )); printf("i : %d\n", ( (i & 0x80000000) != 0 )); return 0; }
c 為負(fù)數(shù)最高位為1,理論上 & 之后應(yīng)該不等于0,所以打印的會(huì)是1;s 為正數(shù)最高位為0,,理論上 & 之后應(yīng)該等于0,打印的會(huì)是0;i 位負(fù)數(shù),會(huì)打印1。下來(lái)我們?cè)?Linux 環(huán)境中用 gcc 編譯下,看看結(jié)果是否和我們分析的一致,結(jié)果如下:
我們打印的結(jié)果也從側(cè)面證實(shí)了我們的分析是對(duì)的。那么在計(jì)算機(jī)內(nèi)部是怎樣表示有符號(hào)數(shù)的呢?答案用補(bǔ)碼來(lái)表示,正數(shù)的補(bǔ)碼為正數(shù)本身,負(fù)數(shù)的補(bǔ)碼為負(fù)數(shù)的絕對(duì)值各位取反后加1。我們來(lái)分析下 -7 的補(bǔ)碼是多少?
-7 ==> |-7| + (末位+1)==> 111 + 1==> 0000 0111 + 1 ==> 1111 1000 + 1 ==> 1111 1001
這是我們分析的結(jié)果,那么我們用計(jì)算器轉(zhuǎn)換下看看,是否和我們分析的一致呢?
我們看到結(jié)果和我們分析的是一致的。在計(jì)算機(jī)內(nèi)部用原碼表示無(wú)符號(hào)數(shù),無(wú)符號(hào)數(shù)默認(rèn)為正數(shù),無(wú)符號(hào)數(shù)沒(méi)有符號(hào)位。對(duì)于固定長(zhǎng)度的無(wú)符號(hào)數(shù),MAX_VALUE + 1 ==> MIN_VALUE,MIN_VALUE - 1 ==> MAX_VALUE。
在 C 語(yǔ)言中變量默認(rèn)為有符號(hào)的類型,unsigned 關(guān)鍵字聲明變量為無(wú)符號(hào)類型。注意:C 語(yǔ)言中只有整數(shù)類型能夠聲明 unsigned 變量。下來(lái)我們?cè)僮鰝€(gè)試驗(yàn),代碼如下:
#includeint main() { unsigned int i = 5; int j = -10; if( (i + j) > 0 ) { printf("i + j > 0\n"); } else { printf("i + j <= 0\n"); } return 0; }
我們當(dāng)然會(huì)認(rèn)為這個(gè)程序輸出的是 i + j <= 0,可事實(shí)是這樣嗎?我們來(lái)編譯下,得到結(jié)果如下:
結(jié)果和我們想的不一樣,那么這是怎么回事呢?原來(lái)在計(jì)算機(jī)內(nèi)部,當(dāng)有符號(hào)數(shù)和無(wú)符號(hào)數(shù)混合運(yùn)算時(shí),計(jì)算機(jī)將自動(dòng)的將有符號(hào)數(shù)轉(zhuǎn)換為無(wú)符號(hào)數(shù)后再進(jìn)行計(jì)算,結(jié)果為無(wú)符號(hào)數(shù)。那么這個(gè)程序輸出的結(jié)果當(dāng)然是大于0的啦。
我們?cè)谶@塊要注意一個(gè)陷阱,那就是錯(cuò)誤的使用了 unsigned 。我們來(lái)看這樣一個(gè)例子,代碼如下:
#includeint main() { unsigned int i = 0; for(i=9; i>=0; i--) { printf("i = %u\n", i); } return 0; }
在我們的認(rèn)為中,這個(gè)程序會(huì)輸出 0-9 就完了,那么真是這樣嗎?我們編譯下,看看結(jié)果
結(jié)果就是如上圖所示,那么這些這么的大的數(shù)字是在哪打印出來(lái)的呢?程序在不停輸出,不得已中斷程序的運(yùn)行。仔細(xì)的看看我們的示例代碼,我們定義的是 unsigned int 類型的,無(wú)符號(hào)類型的。因而它是一直大于0的,在減到0的時(shí)候,再次減1就是 2^32 - 1 了。為什么是32呢?因?yàn)樵?Linux 中,int 型數(shù)據(jù)是 4 個(gè)字節(jié),每個(gè)字節(jié)占 8 bit,所以一共占 32 bit位。
那么我們本節(jié)學(xué)習(xí)了有符號(hào)數(shù)與無(wú)符號(hào)數(shù)。有符號(hào)數(shù)用補(bǔ)碼表示:正數(shù)的符號(hào)位為0,負(fù)數(shù)的符號(hào)位為1。無(wú)符號(hào)數(shù)用原碼表示:無(wú)符號(hào)數(shù)沒(méi)有符號(hào)位,無(wú)符號(hào)數(shù)只用于表示正數(shù)。unsigned 只能修飾整數(shù)類型的變量,當(dāng)有符號(hào)數(shù)和無(wú)符號(hào)數(shù)混合運(yùn)算時(shí),計(jì)算機(jī)將自動(dòng)的將有符號(hào)數(shù)轉(zhuǎn)換為無(wú)符號(hào)數(shù)后再進(jìn)行計(jì)算,結(jié)果為無(wú)符號(hào)數(shù)。后面我們會(huì)繼續(xù)學(xué)習(xí) C 語(yǔ)言的相關(guān)知識(shí)。
歡迎大家一起來(lái)學(xué)習(xí) C 語(yǔ)言,可以加我QQ:243343083。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。