【軟考】——機器數及其運算
機器數和真值的概念: 機器數:一個數在計算機中的二進位制表示形式; 真值:帶符號位的機器數對應的真正數值(十進位制的數)稱為真值; 原碼:符號位+真值的絕對值(二進位制); |
|
原碼的例子???——》 [ +1 ] = 0 0000001,[ -1 ] = 1 0000001; 注意:
|
反碼的例子???——》 [ +1 ] = 0 0000001,[ -1 ] = 1 1111110; 注意: 正數???——》反碼與原碼相同,負數的反碼則是其絕對值按位求反; 負數???——》反碼是在其原碼的基礎上,符號位不變,其餘各個位取反; 【例子】 在這裡,我提示下各位,要看出反碼的十進位制數值,就要把它還原會原碼才可以計算得出; |
補碼的例子: [ +1 ] = 1 0000001;[ -1 ] = 0 1111111; 注意: 1、正數的補碼與其原碼和反碼相同,負數的補碼則等於其反碼的末位加1;(特例:[ +0 ] = 0 0000000;[ -0 ] = 0 0000000) 2、負數的補碼也就是在其原碼的基礎上,符號位不變,其餘各位取反(0:正,1:負),最後+1; 【例子】 |
【軟考知識】 1、最適合進行數字加減運算的數字編碼是補碼;???——》CPU只設置硬體加法器;???——》只有補碼能夠將減法轉化為加法; 2、最合適表示浮點數階碼的數字編碼是移碼;???——》被廣泛用來表示浮點數階碼的數字編碼;???——》用比較階碼的大小來實現真值大小的比較; |
對原碼、反碼、補碼的使用進一步的瞭解???——》
一般我們對加減乘除運算從小學開始學會後,就一直以為計算就該這麼算;但是你要知道,計算機不是人,它只會邏輯;所以加減乘除這相對人類而言是最基礎的運算,但對計算機而言,因為計算機只會辨認"符號位(正負)",所以用二進位制來表示加、減這兩種運算方式,會使計算機的基礎電路設計變得十分複雜;於是人們就想出了將符號位也參與運算的方式;首先我們都知道:1-1=0,但是我們很少會這麼寫:1+(-1)=0;但是這樣機器運算就可以只有加法而沒有了減法,從而機器數的運算方式設計變得簡單啦!
現在就來個原碼栗子吧!讓大家瞭解的更深刻一點哈!
唉!怎麼1+(-1)=-2,這也就是為什麼還要反碼等其他碼;
為了解決這個原碼做減法這個問題,就設計了一個反碼原理,再來一顆栗子(反碼):
通過上面那個例子,大家對原碼和反碼多點了解嗎?其實反碼還有一個問題,那就是“0”這個特殊的數值;雖然大家對+0和-0的理解上是一樣的,但是上面的0帶符號不是就沒有意義啦,而且[ 0000 0000]和[ 1000 0000]兩個編碼都表示0的意思;
於是補碼這個原理就來了,還是和上面一樣,先來個栗子:
上面的栗子用了[0000 0000]表示0,而以前出現-0的奇特數值,就沒有啦!並且可以用[1000 0000]表示-128;
補碼的出現,解決了0的符號以及兩個編碼的問題,而且還能夠多表示一個最低數;
這就是為什麼是8位的二進位制,使用原碼或反碼錶示的範圍:[ -127,+127 ],而使用補碼錶示的範圍為[ -128,,127];
因為機器使用補碼,對於編碼中常用到的32位int型別,可以表示的範圍是:[-2^31,2^31-1],因為第一位表示的是符號位,而使用補碼錶示時又可以多儲存一個最小值;
更深入的瞭解???——》
將減法變成加法,這背後究竟蘊含了怎麼的數學原理呢?
首先將鐘錶想象成是一個1位的12進位制;如果當前時間是6點,而我希望的是將時間設定成4點,那我們需要怎麼做呢?
解決方式有:
1、往回撥2個小時:6-2=4;
2、往前撥10個小時:(6+10)mod 12 = 4;
3、往前撥10+12=22個小時:(6+22)mod 12 = 4;
2,3方法中的mod是指取模操作,16 mod 12 = 4,即用16除以12的餘數是4;從這3個方法中我們可以看到出,鐘錶往回撥(減法)的結果可以用往前撥(加法)代替;
現在的焦點就是落在瞭如何用一個正數來代替一個負數;通過上面的解決方式,我們可以感覺到一些規律,但是數學可是用邏輯來計算的,不能憑著個人的感覺來;
現在,我就來給大家來介紹下同餘和負數取模的概念:
同餘概念:兩個整數a,b;若它們除以整數m所得的餘數相等,則稱a,b對於模m同餘;
負數取模:
mod運算的數學定義:
公式的意思:x mod y等於x減去y乘上x與y的商的下界
再來一個栗子,今天可吃了不少栗子~哦!
-3 mod 2
= -3 -2*
那接下來就求證一下有關鐘錶的問題啦!