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