1. 程式人生 > >計算機基礎之二進位制與原反補

計算機基礎之二進位制與原反補

在計算機程式中,數值運算是基於二進位制的


我們最常見的進位制其實就是我們在生活中用的最多的十進位制,除了十進位制,還有二進位制,八進位制,十六進位制,所謂進位制其實就是計數的一種方式,十進位制就是逢十進一,其它進位制也是類似,二進位制就是逢二進一。


二進位制的產生是因為早期的電子元件只能表達開關的這兩種狀態;八進位制在對變數進行移位操作等比較底層的程式設計是很有用的並且8進位制是用於ACSIC碼的;十六進位制作為計算機領域一種重要的數制,對計算機理論的描述,計算機硬體電路的設計都是很有益的。比如邏輯電路設計中,即要考慮功能的完備,好要考慮用盡可能少的硬體,十六進位制就能起到一些理論分析的作用。比如四位二進位制電路,最多就是十六種狀態,也就是一種十六進位制形式,只有這十六種狀態都被用上了或者儘可能多的被用上,硬體資源才發揮了儘可能大的作用。



以下是三種進位制的表達方式(十進位制在這不做介紹):
二進位制一般以0b開頭或以B結尾,
八進位制一般以0開頭,
十六進位制一般以0x開頭,數字0-9,字母a-f組成。
那麼進位制之間如何來轉換呢?在這裡介紹兩種方式來做任意進位制之間的轉換以十進位制為橋樑(位權展開法,餘數定理)。
具體的推導過程我就不在此展示,下面給幾個例子,供大家參考
1:得到下面資料的十進位制值:
0b10101
=1*2^4+0*2^3+1*2^2+0*2^1+1*2^0
=16+0+4+0+1
=21
0123
=0*8^3+1*8^2+2*8^1+3*8^0
=0+64+16+3
=83
0x3c
=3*16^1+12*8^0
=48+12
=60

2:得到52的二進位制,十進位制,十六進位制

得到二進位制:
52 / 2 = 26   0
26 / 2 = 13   0
13 / 2 = 6    1
6  / 2 = 3    0
3  / 2 = 1    1
1  / 2 = 0    1
0b110100

得到八進位制:
52 / 8 = 64
6  / 8 = 0      6

064

得到十六進位制:
52 / 16  =  34
3  / 16  =  0        3

0x34
大家可以發現上面的例子都是正整數,那麼負數在計算機中如何表達呢?

原碼:原碼(true form)是一種計算機中對數字的二進位制定點表示方法。原碼錶示法在數值前面增加了一位符號位(即最高位為符號位):正數該位為0,負數該位為1(0有兩種表示:+0和-0),其餘位表示數值的大小,


反碼:反碼是數值儲存的一種,多應用於系統環境設定,反碼錶示法規定:正數的反碼與其原碼相同;負數的反碼是對其原碼逐位取反,但符號位除外。

和補碼:在計算機系統中,數值一律用補碼來表示和儲存,補碼錶示法規定:正數的補碼與其原碼相同;負數的補碼是在其反碼的末位加1。

有符號資料表示法的練習
A:已知某數X的原碼為10110100B,試求X的補碼和反碼。

符號位數值位

原碼:10110100

反碼:11001011

補碼:11001100

B:已知某數X的補碼11101110B,試求其原碼。

符號位數值位

補碼:11101110

反碼:11101101

原碼:10010010


如果以上文章有什麼問題,歡迎大家指正