成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

csapp2.2整數(shù)表示-創(chuàng)新互聯(lián)

整形數(shù)據(jù)類(lèi)型
  • C語(yǔ)言支持多種數(shù)據(jù)類(lèi)型用于表示有限范圍的整數(shù)
    在這里插入圖片描述
    在這里插入圖片描述
    其中各類(lèi)型的特點(diǎn)是取值范圍不對(duì)稱(chēng),負(fù)數(shù)的范圍比整數(shù)的范圍大1
  • C語(yǔ)言標(biāo)準(zhǔn)定義了每種數(shù)據(jù)類(lèi)型能夠表示的最小的取值范圍
    在這里插入圖片描述
    其中除了固定大小的的數(shù)據(jù)類(lèi)型外,它們要求正數(shù)和負(fù)數(shù)的取值范圍是對(duì)稱(chēng)的,固定大小的數(shù)據(jù)類(lèi)型與2-9一致,包括正數(shù)與負(fù)數(shù)的不對(duì)稱(chēng)性。
無(wú)符號(hào)數(shù)的編碼
  • 設(shè)2進(jìn)制整數(shù)有w位,便可用函數(shù)B2U表示在這里插入圖片描述
    例如在這里插入圖片描述
    該函數(shù)可將一個(gè)長(zhǎng)度為w的位向量映射為0 ~ 2w-1之間的一個(gè)唯一值,
    同時(shí)在0~ 2w-1之間的任何一個(gè)整數(shù)都可以映射為一個(gè)唯一的長(zhǎng)度為w的位模式。
補(bǔ)碼編碼
  • 最常見(jiàn)的有符號(hào)數(shù)的表示方式是補(bǔ)碼編碼,其中單個(gè)字的有效最高位被定義為負(fù)權(quán)在這里插入圖片描述
    當(dāng)最高位為1,該數(shù)為-2w-1+其他位的數(shù)。例如
    在這里插入圖片描述
  • 因此,w位的補(bǔ)碼能表示的最小值為-2w-1大值為2w-1-1,
  • 以下是針對(duì)不同字長(zhǎng),幾個(gè)重要數(shù)字的位模式和數(shù)值在這里插入圖片描述
    其中有幾點(diǎn)值得注意,
    第一,TMin并沒(méi)有與之對(duì)應(yīng)的正數(shù),|TMin|=|TMax|+1,這是因?yàn)樵谘a(bǔ)碼中,一半的位模式表示負(fù)數(shù),另一半的位模式表示非負(fù)數(shù)(0和正整數(shù))
    第二,大的無(wú)符號(hào)數(shù)值剛好比大的補(bǔ)碼的兩倍大1,補(bǔ)碼表示中所有的負(fù)數(shù)在無(wú)符號(hào)表示中都變?yōu)榱苏龜?shù),
  • 為了更好理解,有如下代碼
#include#include "headfile.h"
int main (){short x = 12345;
short mx = -x;

show_bytes((byte_pointer)&x, sizeof(short));
show_bytes((byte_pointer)&mx, sizeof(short));
return 0;
}
有符號(hào)數(shù)和無(wú)符號(hào)數(shù)之間的轉(zhuǎn)換
  • 有如下代碼
#includeint main(){short int v=-12345;
    unsigned short uv=(unsigned)v;
    printf("v=%d,uv=%u\n",v,uv);
    return 0;
}

該代碼輸出結(jié)果為v=-12345,uv=53191
由此可見(jiàn),強(qiáng)制類(lèi)型轉(zhuǎn)換不會(huì)改變?cè)瓟?shù)的位值,只是改變了解釋這些位的方式。

成都創(chuàng)新互聯(lián)專(zhuān)注于芝罘企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站開(kāi)發(fā),商城網(wǎng)站建設(shè)。芝罘網(wǎng)站建設(shè)公司,為芝罘等地區(qū)提供建站服務(wù)。全流程專(zhuān)業(yè)公司,專(zhuān)業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)專(zhuān)業(yè)和態(tài)度為您提供的服務(wù)
  • 補(bǔ)碼轉(zhuǎn)換為無(wú)符號(hào)數(shù)
    在補(bǔ)碼的值上加上最高位,如下
    在這里插入圖片描述
  • 無(wú)符號(hào)數(shù)轉(zhuǎn)換為補(bǔ)碼,同理在這里插入圖片描述
  • 下圖可以更直觀的表示這兩種轉(zhuǎn)換
    在這里插入圖片描述
C語(yǔ)言中的有符號(hào)數(shù)和無(wú)符號(hào)數(shù)
  • C語(yǔ)言支持所有整數(shù)類(lèi)型的無(wú)符號(hào)和有符號(hào)數(shù)的運(yùn)算
  • 導(dǎo)致類(lèi)型轉(zhuǎn)換發(fā)生的幾種情況
    • 顯式強(qiáng)制類(lèi)型轉(zhuǎn)換
    int tx, ty;
    unsigned ux, uy;
    tx = (int)ux;
    uy = (unsigned)ty;
    
    • 一種類(lèi)型的表達(dá)式被賦值給另外一種類(lèi)型的變量時(shí)
    int tx,ty;
    unsigned int ux,uy;
    tx=ux;//cast to signed
    uy=ty;//cast to unsigned
    • 當(dāng)用 printf進(jìn)行格式化輸出時(shí)
    int x=-1;
    unsigned u=2147483648;
    
    printf("x = %u = %d\n",x);
    printf("u = %u = %d\n",u);
    當(dāng)其在32位機(jī)器上運(yùn)行時(shí),輸出為
    x = 4294967295 = -1
    u = 2147483648 = -2147483648
    • 當(dāng)執(zhí)行一個(gè)運(yùn)算時(shí),如果它的一個(gè)運(yùn)算數(shù)是有符號(hào)的而另一個(gè)運(yùn)算時(shí)是無(wú)符號(hào)的時(shí),那么C語(yǔ)言會(huì)將這兩個(gè)數(shù)都隱式地轉(zhuǎn)換為無(wú)符號(hào)數(shù),并假設(shè)這兩個(gè)數(shù)都是非負(fù)。
      這種運(yùn)算對(duì)于像<和>這樣的運(yùn)算來(lái)說(shuō),會(huì)導(dǎo)致非直觀的結(jié)果。
      例如(-1<0u) =0
擴(kuò)展一個(gè)數(shù)字的位表示
  • 無(wú)符號(hào)數(shù)的零擴(kuò)展
    將一個(gè)無(wú)符號(hào)數(shù)轉(zhuǎn)換為更大的數(shù)據(jù)類(lèi)型時(shí),只需在多出來(lái)的高位全部補(bǔ)0
  • 補(bǔ)碼數(shù)的符號(hào)擴(kuò)展
    當(dāng)該補(bǔ)碼數(shù)為正時(shí),在多出的高位上補(bǔ)0
    當(dāng)該補(bǔ)碼數(shù)為負(fù)時(shí),在多出的高位上補(bǔ)1
    例如:
short sx = -12345;  //補(bǔ)碼數(shù)的符號(hào)擴(kuò)展
    unsigned short usx = sx;
    int x = sx;
    unsigned ux = usx;

    printf("sx = %d:\t", sx);
    show_bytes((byte_pointer)&sx, sizeof(short));

    printf("usx = %u:\t", usx);
    show_bytes((byte_pointer)&usx, sizeof(short));

    printf("x = %d:\t", x);
    show_bytes((byte_pointer)&x, sizeof(short));

    printf("ux = %u:\t", ux);
    show_bytes((byte_pointer)&ux, sizeof(short));

這段代碼打印如下輸出
sx = -12345: c7cf
usx = 53191: c7cf
x = -12345: ffffc7cf
ux = 53191: 0000c7cf

  • 從一個(gè)數(shù)據(jù)大小到另一個(gè)數(shù)據(jù)大小的轉(zhuǎn)換,以及無(wú)符號(hào)和有符號(hào)數(shù)字之間的轉(zhuǎn)換的相對(duì)順序能夠影響一個(gè)程序的行為。例如下面這段代碼:
unsigned uy = sx;   //數(shù)據(jù)類(lèi)型轉(zhuǎn)換的順序?qū)Τ绦虻挠绊?
    printf("uy = %u:\t", uy);
    show_bytes((byte_pointer)&uy, sizeof(unsigned));

其輸出為
uy = 4294954951: c7cfffff
這表明在將short轉(zhuǎn)換為unsigned時(shí),我們要先改變大小,之后再完成從有符號(hào)到無(wú)符號(hào)的轉(zhuǎn)換,即(unsigned)sx等價(jià)于(unsigned)(int)sx。
同樣的

int func1(unsigned word)    //練習(xí)題2.23
    {return (int)((word<< 48) >>248);
    }
    int func2(unsigned word)
    {return ((int)word<< 48) >>48;
    }
    unsigned w = 0x87654321;
    printf("%d\n", func1(w));
    printf("%d\n", func2(w));

這段代碼的輸出為
67
17185

截?cái)鄶?shù)字
  • 如這段代碼所示
int x = 53191;
short sx = (short)x;
int y = sx;

當(dāng)我們把x強(qiáng)制類(lèi)型轉(zhuǎn)換為short時(shí),我們就將32位的int截?cái)酁榱?6位的short int。此時(shí)這個(gè)16位的位模式就是-12345的補(bǔ)碼表示。當(dāng)我們把它強(qiáng)制類(lèi)型轉(zhuǎn)換回int時(shí)符號(hào)擴(kuò)展把高16位設(shè)置為1,從而生成-12345的32位補(bǔ)碼表示。
(先縮小(溢出),后補(bǔ)位)

  • 當(dāng)我們截?cái)嘁粋€(gè)數(shù)字時(shí)可能會(huì)改變它的值,這也是溢出的一種形式。
關(guān)于有符號(hào)數(shù)與無(wú)符號(hào)數(shù)的建議
  • 就像我們看到的那樣,有符號(hào)數(shù)到無(wú)符號(hào)數(shù)的隱式強(qiáng)制類(lèi)型轉(zhuǎn)換導(dǎo)致了某些非直觀的行為。而這些非直觀的特性經(jīng)常導(dǎo)致程序錯(cuò)誤。并且這種包含了隱式強(qiáng)制類(lèi)型轉(zhuǎn)換的細(xì)微差別的錯(cuò)誤很難被發(fā)現(xiàn)。
    例如下面這段代碼
float sum_elements(float a[],unsigned length){int i;
    float result=0;

    for (i = 0; i<= length-1; i++)
    {result+=a[i];
    }
    return result;
}

其中當(dāng)參數(shù)length為0時(shí),會(huì)導(dǎo)致for中l(wèi)ength-1為4294967295,而a[]并沒(méi)有這么多位,因此導(dǎo)致內(nèi)存錯(cuò)誤。
又如下
在這里插入圖片描述
當(dāng)兩字符串長(zhǎng)度之差大于int可表示的大正數(shù)時(shí),返回值發(fā)生溢出變?yōu)樨?fù)值,此時(shí)函數(shù)運(yùn)算的結(jié)果是錯(cuò)誤的,而將該函數(shù)定義為unsigned int的話,便可以規(guī)避掉這一問(wèn)題。

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

新聞標(biāo)題:csapp2.2整數(shù)表示-創(chuàng)新互聯(lián)
文章出自:http://jinyejixie.com/article0/jepio.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開(kāi)發(fā)、網(wǎng)站策劃、ChatGPT、微信公眾號(hào)、標(biāo)簽優(yōu)化、搜索引擎優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司
朝阳县| 宁安市| 钟祥市| 左云县| 武清区| 庆阳市| 徐闻县| 石首市| 宝清县| 东海县| 留坝县| 龙海市| 南木林县| 孟州市| 邮箱| 鹤壁市| 房山区| 高淳县| 威远县| 达日县| 台北县| 通渭县| 海晏县| 永登县| 杂多县| 兴文县| 金沙县| 阳山县| 昌邑市| 镶黄旗| 姜堰市| 金秀| 尉犁县| 板桥市| 瑞安市| 镇宁| 舞钢市| 壶关县| 广南县| 巢湖市| 屏山县|