计算机所有数据的表示方式都是用,计算机数据表示
1、進制
1.1 進制的由來
進制:是一種進位的方式。x進制,表示逢x進1。
計算機的電子原件的狀態(tài):開,關(guān)。
那么,我們表達數(shù)據(jù)的時候,也是按照開,關(guān)的狀態(tài)來表示的。
如果我們表達數(shù)據(jù)僅僅使用這兩種昨天,那么能夠表達的數(shù)據(jù)是比較少的。
而我們常見的數(shù)據(jù),英文字母,數(shù)字,標(biāo)點符號,這就很多了。
為了能夠表示更多的數(shù)據(jù),國際化組織就規(guī)定,用8個這樣的信號來表示一個數(shù)據(jù),并且用1,0表示兩種狀態(tài),這個數(shù)據(jù)的單位叫:字節(jié)。
由這樣的1,0組成的數(shù)據(jù)就是二進制數(shù)據(jù)。
- 單位轉(zhuǎn)換
1byte=8bit
1kB=1024byte
1MB=1024kB
1GB=1024MB
1T=1024GB
- 基礎(chǔ)補充:
大寫B(tài)(byte),字節(jié);小寫b(bit),比特;
1B=8b,即一個字節(jié)等于8個比特位。
1KB=8kb,k表示千,即1千字節(jié)等于8千比特。一般來說,計算機中的進位是1024進位的,但是在通信中,為了方便計算,通常用千進位。
(為什么要用1024進位,因為計算機碼是以二進制為基礎(chǔ),2的冪數(shù)可以反映二進制的位數(shù),因為2的10次冪是1024,最接近1000(1K),方便十進制的估算。)
1byte=8bits,兩者換算是1:8的關(guān)系。
1Byte就是1個字節(jié),1個字節(jié)是由8個二進制位組成。
1.2 進制的表示
定義:
二進制數(shù)
每一位使用兩個不同數(shù)字表示(0,1)
低位和高位的關(guān)系是:逢2進1
各位的權(quán)值是2的整數(shù)次冪(基數(shù)是2)
標(biāo)志:尾部加B
例:101.01B=1×22+0×22+1×20,+0×2?1+1×2?2=5.25
八進制數(shù)
每一位使用八個不同數(shù)字表示(0,1,2,3,4,5,6,7)
低位和高位的關(guān)系是:逢8進1
各位的權(quán)值是8的整數(shù)次冪(基數(shù)是8)
標(biāo)志:尾部加Q
例:365.2Q=3×82+6×81+5×80+2×8?1=245.25
十六進制
每一位使用十六個不同數(shù)字表示(0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F)
低位和高位的關(guān)系是:逢16進1
各位的權(quán)值是16的整數(shù)次冪(基數(shù)是16)
標(biāo)志:尾部加H
例:F5.4H=15×161+5×160+4×16?1=245.25
第一種表示方式:
(1100101100)2=(1454)8
(1100101100)2=(32C)16
第二種表示方式(在末尾加字母):
例如:二進制再末尾加B,十進制加D,八進制加Q,十六進制加H
1.3 進制的轉(zhuǎn)換
1.3.1 R進制轉(zhuǎn)十進制使用按權(quán)展開法
其具體操作方式為:將R進制數(shù)的每一位數(shù)值用RKRK形式表示,即冪的底數(shù)是R,指數(shù)為K,K與該位和小數(shù)點之間的距離有關(guān)。當(dāng)該位位于小數(shù)點左邊,K值是該位和小數(shù)點之間數(shù)碼的個數(shù),而當(dāng)該位位于小數(shù)點右邊,K值是負值,其絕對值是該位和小數(shù)點之間數(shù)碼的個數(shù)加1。
例如 二進制:?10100.01=1?24+1?22+1?2?2=20.2510100.01=1·24+1·22+1·2?2=20.25
例如 七進制?604.01=6?72+4?70+1?7?2≈298.02604.01=6·72+4·70+1·7?2≈298.02
1.3.2 十進制轉(zhuǎn)R進制
如果是整數(shù),直接使用短除法。(例如將94轉(zhuǎn)換為二進制。)
得到結(jié)果為1011110
- 如果是浮點數(shù),對整數(shù)和小數(shù)分開轉(zhuǎn)換;整數(shù)部分:除以2取余,小數(shù)部分:乘以2取整。(例如29.6875 -> 11101.1011B)
注意十進制小數(shù)(如0.63)在轉(zhuǎn)換時會出現(xiàn)二進制無窮小數(shù),這時只能取近似值。
1.3.3 二進制與八進制的互換(用三位二進制數(shù)一組表示一位)與十六進制數(shù)(用四位二進制數(shù)一組表示一位)
- 八進制 -> 二進制:把每個八進制數(shù)字改寫成等值的3位二進制數(shù),且保持高地位的次序不變。
例:2 4 6 3 2 Q - >
010 100 110 111 011 010 B
- 二進制 ->八進制:整數(shù)部分從低位到高位每3組用一個等值的八進制數(shù)來替換,不足3位時在高位補0湊滿3位;小數(shù)部分從高位向低位每3位用一個等值八進制數(shù)來替換,不足3位時在低位補0湊滿三位。
例:1 101 001 110. 110 01B ->
001 101 001 110. 110 010B ->
1 5 1 6 6 2Q
3. 機器數(shù)采用原碼,反碼和補碼等編碼方法,稱為碼制。
3.1 機器數(shù)與真值
3.1 機器數(shù)
一個數(shù)在計算機中的二進制表示形式, 叫做這個數(shù)的機器數(shù)。機器數(shù)是帶符號的,在計算機用一個數(shù)的最高位存放符號, 正數(shù)為0, 負數(shù)為1.
比如,十進制中的數(shù) +3 ,計算機字長為8位,轉(zhuǎn)換成二進制就是00000011。如果是 -3 ,就是 10000011 。
那么,這里的 00000011 和 10000011 就是機器數(shù)。
3.2 真值
因為第一位是符號位,所以機器數(shù)的形式值就不等于真正的數(shù)值。例如上面的有符號數(shù) 10000011,其最高位1代表負,其真正數(shù)值是 -3 而不是形式值131(10000011轉(zhuǎn)換成十進制等于131)。所以,為區(qū)別起見,將帶符號位的機器數(shù)對應(yīng)的真正數(shù)值稱為機器數(shù)的真值。
例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1
3.2 原碼,反碼和補碼
3.2.1 概念
在探求為何機器要使用補碼之前, 讓我們先了解原碼, 反碼和補碼的概念.對于一個數(shù), 計算機要使用一定的編碼方式進行存儲. 原碼, 反碼, 補碼是機器存儲一個具體數(shù)字的編碼方式.
- 原碼
原碼就是符號位加上真值的絕對值, 即用第一位表示符號, 其余位表示值. 比如如果是8位二進制:
[+1]原 = 0000 0001
[-1]原 = 1000 0001
第一位是符號位. 因為第一位是符號位, 所以8位二進制數(shù)的取值范圍就是:
[1111 1111 , 0111 1111] 即 [-127 , 127]
原碼是人腦最容易理解和計算的表示方式.
- 反碼
反碼的表示方法是:正數(shù)的反碼是其本身
負數(shù)的反碼是在其原碼的基礎(chǔ)上, 符號位不變,其余各個位取反.
[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反
可見如果一個反碼表示的是負數(shù), 人腦無法直觀的看出來它的數(shù)值. 通常要將其轉(zhuǎn)換成原碼再計算.
- 補碼
補碼的表示方法是:
正數(shù)的補碼就是其本身
負數(shù)的補碼是在其原碼的基礎(chǔ)上, 符號位不變, 其余各位取反, 最后+1. (即在反碼的基礎(chǔ)上+1)
[+1] = [00000001]原 = [00000001]反 = [00000001]補
[-1] = [10000001]原 = [11111110]反 = [11111111]補
對于負數(shù), 補碼表示方式也是人腦無法直觀看出其數(shù)值的. 通常也需要轉(zhuǎn)換成原碼在計算其數(shù)值.
3.2.2. 為何要使用原碼, 反碼和補碼
現(xiàn)在我們知道了計算機可以有三種編碼方式表示一個數(shù). 對于正數(shù)因為三種編碼方式的結(jié)果都相同:
[+1] = [00000001]原 = [00000001]反 = [00000001]補
1
所以不需要過多解釋. 但是對于負數(shù):
[-1] = [10000001]原 = [11111110]反 = [11111111]補
1
可見原碼, 反碼和補碼是完全不同的. 既然原碼才是被人腦直接識別并用于計算表示方式, 為何還會有反碼和補碼呢?
首先, 因為人腦可以知道第一位是符號位, 在計算的時候我們會根據(jù)符號位, 選擇對真值區(qū)域的加減. (真值的概念在本文最開頭). 但是對于計算機, 加減乘數(shù)已經(jīng)是最基礎(chǔ)的運算, 要設(shè)計的盡量簡單. 計算機辨別”符號位”顯然會讓計算機的基礎(chǔ)電路設(shè)計變得十分復(fù)雜! 于是人們想出了將符號位也參與運算的方法. 我們知道, 根據(jù)運算法則減去一個正數(shù)等于加上一個負數(shù), 即: 1-1 = 1 + (-1) = 0 , 所以機器可以只有加法而沒有減法, 這樣計算機運算的設(shè)計就更簡單了.
于是人們開始探索 將符號位參與運算, 并且只保留加法的方法. 首先來看原碼:
計算十進制的表達式: 1-1=0
1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2
1
如果用原碼表示, 讓符號位也參與計算, 顯然對于減法來說, 結(jié)果是不正確的.這也就是為何計算機內(nèi)部不使用原碼表示一個數(shù).
為了解決原碼做減法的問題, 出現(xiàn)了反碼:
計算十進制的表達式: 1-1=0
1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原= [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0
發(fā)現(xiàn)用反碼計算減法, 結(jié)果的真值部分是正確的. 而唯一的問題其實就出現(xiàn)在”0”這個特殊的數(shù)值上. 雖然人們理解上+0和-0是一樣的, 但是0帶符號是沒有任何意義的. 而且會有[0000 0000]原和[1000 0000]原兩個編碼表示0.
于是補碼的出現(xiàn), 解決了0的符號以及兩個編碼的問題:
1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]補 + [1111 1111]補 = [0000 0000]補=[0000 0000]原
1
這樣0用[0000 0000]表示, 而以前出現(xiàn)問題的-0則不存在了.而且可以用[1000 0000]表示-128:
(-1) + (-127) = [1000 0001]原 + [1111 1111]原 = [1111 1111]補 + [1000 0001]補 = [1000 0000]補
-1-127的結(jié)果應(yīng)該是-128, 在用補碼運算的結(jié)果中, [1000 0000]補 就是-128. 但是注意因為實際上是使用以前的-0的補碼來表示-128, 所以-128并沒有原碼和反碼表示.(對-128的補碼表示[1000 0000]補算出來的原碼是[0000 0000]原, 這是不正確的)
使用補碼, 不僅僅修復(fù)了0的符號以及存在兩個編碼的問題, 而且還能夠多表示一個最低數(shù). 這就是為什么8位二進制, 使用原碼或反碼表示的范圍為[-127, +127], 而使用補碼表示的范圍為[-128, 127].
因為機器使用補碼, 所以對于編程中常用到的32位int類型, 可以表示范圍是: [-231, 231-1] 因為第一位表示的是符號位.而使用補碼表示時又可以多保存一個最小值.
3.2.3 總結(jié):
原碼是最符合人腦的,用最高位表示符號位,其余位表示數(shù)值位。
反碼是為了方便帶符號的機器數(shù)之間運算,讓符號位也參與運算。(原理是對原碼操作,符號位不變,數(shù)值位取反)(注意結(jié)合1-1這個例子來理解!)
補碼是為了解決-0以及[00000000]原和[10000000]原兩個編碼都表示0這個問題,在反碼的基礎(chǔ)上加1,就能只用[00000000]來表示0了,[10000000]則表示-128.(原理是對反碼基礎(chǔ)上加1)(注意結(jié)合1-1和-1-127這兩個例子來理解!)
轉(zhuǎn)自:
https://blog.csdn.net/sgq_csdn/article/details/79181440#11-進制的由來,個人感覺這篇文章寫得非常贊,強烈推薦
總結(jié)
以上是生活随笔為你收集整理的计算机所有数据的表示方式都是用,计算机数据表示的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 升级后的小黄豆,因不够传神而被网友嫌弃了
- 下一篇: arma3自定义服务器,Arma3 生存