#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ù)的位值,只是改變了解釋這些位的方式。
int tx, ty;
unsigned ux, uy;
tx = (int)ux;
uy = (unsigned)ty;
int tx,ty;
unsigned int ux,uy;
tx=ux;//cast to signed
uy=ty;//cast to unsigned
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í),輸出為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
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
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ǔ)位)
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)
猜你還喜歡下面的內(nèi)容