C语言有符号和无符号数
%x表示無(wú)符號(hào)十六進(jìn)制
%#x表示0x的十六進(jìn)制
%o 無(wú)符號(hào)以八進(jìn)制表示的整數(shù)
%lu表示輸出無(wú)符號(hào)長(zhǎng)整型整數(shù)
%u表示輸出無(wú)符號(hào)整型整數(shù)
輸出結(jié)果為:
a>b a=-1 b=1
當(dāng)執(zhí)行一個(gè)運(yùn)算時(shí)(如這里的a>b),如果它的一個(gè)運(yùn)算數(shù)是有符號(hào)的而另一個(gè)數(shù)是無(wú)符號(hào)的,那么C語(yǔ)言會(huì)隱式地將有符號(hào) 參數(shù)強(qiáng)制類(lèi)型為無(wú)符號(hào)數(shù),并假設(shè)這兩個(gè)數(shù)都是非負(fù)的,來(lái)執(zhí)行這個(gè)運(yùn)算。
原因: (把有符號(hào)的變成了無(wú)符號(hào)的)
把if語(yǔ)句改為if(a > (int)b)即可。這樣程序就會(huì)認(rèn)為是兩個(gè)有符號(hào)數(shù)在進(jìn)行比較,-1就不會(huì)隱式地轉(zhuǎn)換為無(wú)符號(hào)數(shù)而變成UMax。在32和64位的機(jī)子上,-1對(duì)應(yīng)的無(wú)符號(hào)數(shù)應(yīng)該是4 294 967 295,即32位的無(wú)符號(hào)數(shù)的最大值(UMax)
解決: (無(wú)符號(hào)轉(zhuǎn)為有符號(hào))
把if語(yǔ)句改為if(a > (int)b)即可。這樣程序就會(huì)認(rèn)為是兩個(gè)有符號(hào)數(shù)在進(jìn)行比較,-1就不會(huì)隱式地轉(zhuǎn)換為無(wú)符號(hào)數(shù)而變成UMax。
建議:
盡量避免有符號(hào)數(shù)與無(wú)符號(hào)數(shù)的比較運(yùn)算和避免減法運(yùn)算,在很多時(shí)候,在unsigned的世界里,x-y>0與x>y都是不等價(jià)的。
extern int a; //聲明一個(gè)變量 (標(biāo)準(zhǔn)的聲明)
int a; //定義一個(gè)變量 如果已經(jīng)被定義了,則為聲明
無(wú)符號(hào)char類(lèi)型數(shù)運(yùn)算
unsigned char s = 0;
s = s - 1;
printf(“%d\n”,s) //輸出255 相當(dāng)于0加上-1的補(bǔ)碼 0000 0000 + 1111 1111 = 1111 1111 (255)
有符號(hào)char類(lèi)型數(shù)運(yùn)算
char s = 127; 0111 1100
s = s + 5; 0111 1111
補(bǔ)碼 =》原碼 符號(hào)位不變,其它位取反,最后一位加1,
例如:
補(bǔ)碼:1000 0100 132
過(guò)程:1111 1011 =》1111 1100
原碼:0111 1100 -127
當(dāng)表達(dá)式中存在有符號(hào)類(lèi)型和無(wú)符號(hào)類(lèi)型時(shí)所有的操作數(shù)都自動(dòng)轉(zhuǎn)換為無(wú)符號(hào)類(lèi)型。
總結(jié)
以上是生活随笔為你收集整理的C语言有符号和无符号数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python下批量修改图片格式和大小
- 下一篇: 【大数据之路-阿里巴巴大数据实践】第一篇