C語言中,原碼,補(bǔ)碼和反碼怎么換算?
原碼、反碼、補(bǔ)碼都是有符號(hào)定點(diǎn)數(shù)的表示方法。
一個(gè)有符號(hào)定點(diǎn)數(shù)的最高位為符號(hào)位,0是正,1是副。
以下都以8位整數(shù)為例,
原碼就是這個(gè)數(shù)本身的二進(jìn)制形式。
例如
1000001 就是-1
0000001 就是+1
正數(shù)的反碼和補(bǔ)碼都是和原碼相同。
負(fù)數(shù)的反碼是將其原碼除符號(hào)位之外的各位求反
[-3]反=[10000011]反=11111100
負(fù)數(shù)的補(bǔ)碼是將其原碼除符號(hào)位之外的各位求反之后在末位再加1。
[-3]補(bǔ)=[10000011]補(bǔ)=11111101
一個(gè)數(shù)和它的補(bǔ)碼是可逆的。
為什么要設(shè)立補(bǔ)碼呢?
第一是為了能讓計(jì)算機(jī)執(zhí)行減法:
[a-b]補(bǔ)=a補(bǔ)+(-b)補(bǔ)
第二個(gè)原因是為了統(tǒng)一正0和負(fù)0
正零:00000000
負(fù)零:10000000
這兩個(gè)數(shù)其實(shí)都是0,但他們的原碼卻有不同的表示。
但是他們的補(bǔ)碼是一樣的,都是00000000
特別注意,如果+1之后有進(jìn)位的,要一直往前進(jìn)位,包括符號(hào)位。ㄟ@和反碼是不同的。
[10000000]補(bǔ)
=[10000000]反+1
=11111111+1
=(1)00000000
=00000000(最高位溢出了,符號(hào)位變成了0)
有人會(huì)問
10000000這個(gè)補(bǔ)碼表示的哪個(gè)數(shù)的補(bǔ)碼呢?
其實(shí)這是一個(gè)規(guī)定,這個(gè)數(shù)表示的是-128
所以n位補(bǔ)碼能表示的范圍是
-2^(n-1)到2^(n-1)-1
比n位原碼能表示的數(shù)多一個(gè)
承擔(dān)因您的行為而導(dǎo)致的法律責(zé)任,
本站有權(quán)保留或刪除有爭議評(píng)論。
參與本評(píng)論即表明您已經(jīng)閱讀并接受
上述條款。