一、進制
我們知道程序在計算機內部是以二進制的方式進行存儲的,我們要想知道程序在計算機內部的存儲,首先要明白二進制。這是程序存儲最基本的形式,首先我們需要理解一下幾個問題:
1、進制的概念?
2、計算機中為什麼要用二進制?
3、為什麼又會出現八進制、十六進制?
4、所有進制之間的轉換?
- 進制的概念?
進制也就是進位制,是人們規定的一種進位方法。 對於任何一種進制—X進制,就表示某一位置上的數運算時是逢X進一位。 十進制是逢十進一,十六進制是逢十六進一,二進制就是逢二進一,以此類推,x進制就是逢x進位。
進制數可以通過位置計數法來表示,通過位置計數法,每個數都有基數,位權和權值。
基數:X進制則基數為:0~X-1,如二進制的基數為0和1。
位權:對於n進制數,其位權是n的整數次冪。如十進制中123,1這個數的位權為:10^2=100,2這個數的位權為:10^1=10,3這個數的位權為:10^0=1。
權值:等於該數值乘以它所在位置的位權。如十進制中的123,1的權值為:1*10^2=100,2這個數的位權為:2*10^1=20,3這個數的權值為:3*10^0=3。
- 計算機中為什麼要用二進制?
計算機使用二進制是由它的內部物理結構所決定的,由於計算機內部都是由一個個門電路所構成,當計算機工作的時候,電路通電工作,於是每個輸出端就有了電壓。電壓的高低通過模數轉換即轉換成了二進制:高電平是由1表示,低電平由0表示。也就是說將模擬電路轉換成為數字電路。這裡的高電平與低電平可以人為確定,一般地,2.5伏以下即為低電平,3.2伏以上為高電平。數據在計算機中以器件的物理狀態表示,採用二進制數字系統,計算機處理所有的字符或符號也要用二進制編碼來表示。
- 為什麼又會出現八進制、十六進制?
符合人類思維的是十進制,為什麼計算機會出現八進制、十六進制?由於計算機只能存儲二進制,但是大量的二進制不便於人們的閱讀,所以需要用一種更簡單的方式來表示。而2^3=8,2^4=16,3個二進制位就可以表示一個八進制,4個二進制可以轉換成一個十六進制。所以出現了便於人們使用的八進制、十六進制。
- 所有進制之間的轉換?
(1)、八進制、十六進制、二進制————–>十進制
都是按權展開的多項式相加得到十進制的結果。
(2)、十進制————–>八進制、十六進制、二進制
按照整數部分除以基數(r)取餘,則它的r進製為餘數結果的逆序,小數部分乘以基數(r)取整。如:十進制10.25 到二進制:整數部分除2,一步步取餘。小數部分乘2,一步步取整。
(3)、二進制八進制、十六進制
二進制到八進制可以每三位一組,小數點前面的不夠三位的前面加0,小數點後面的不夠三位的後面加0,然後寫出每一組的對應的十進制數,順序排列起來就得到所要求的八進制數了。
二進制到十六進制同樣的道理每四位一組。
二、二進制能表示的含義
三、基本數據類型在計算機中的存儲
(1)、字符型
字符型是將相應的ASCII代碼放到存儲單元中。 例如字符’a’的ASCII代碼為97,’b’為98,在內存中變量c1、c2的值如下圖(a)所示,但數據在計算機內部是以二進制進行存儲的,如(b)所示。
(2)、整形
補碼
- 12的二進制表示為:0000 0000 0000 0000 0000 0000 0000 1100
- -12的二進制表示為:1000 0000 0000 0000 0000 0000 0000 1100
- 則:12+(-12)為:1000 0000 0000 0000 0000 0000 0001 1000 十進制為:-24
- 為了防止出現這種錯誤,所以出現了補碼。
- 因為:1111 1111 1111 1111 1111 1111 1111 1111+1=0;
- 所以:將負數轉換成1111 1111 1111 1111 1111 1111 1111 1111 -負數的絕對值-1;
- 則:負數的補碼計算方式是取絕對值的二進制,按位取反再加1
- 比如:-5這個數
- 先取絕對值,即5,即 00000000 00000000 00000000 00000101
- 然後按位取反:11111111 11111111 11111111 11111010
- 再加1:即 11111111 11111111 11111111 11111011
- 整數在計算機內部是以補碼的形式來進行存儲的,正整數的補碼為它本身,負整數的補碼最高位符號位保持不變,其他位取反再加一。
(3)、浮點型
首先我們看一個簡單的程序:
為什麼結果會出現誤差,這是由於浮點型的存儲方式所影響的。
- 在 IEEE 標準中,浮點數是將特定長度的連續字節的所有二進制位分割為特定寬度的符號域,指數域和尾數域三個域,其中保存的值分別用於表示給定二進制浮點數中的符 號,指數和尾數。這樣,通過尾數和可以調節的指數(所以稱為”浮點”)就可以表達給定的數值了。浮點型中有兩種,一種是4Byte的float型,一種是8Byte的double型,這兩種計算方式相同,只是表示的精度不同而已。
float型是遵循IEEE R32.24規範,即1位符號位、8位階碼、23位尾數
- 計算方式:
- 符號位:先用科學計數法表示出該數的二進制,最高位一位表示符號,0為正,1為負。
- 階碼:這裡階碼採用移碼錶示,對於float型數據其規定偏置量為127,階碼有正有負,對於8位二進制,則其表示範圍為-128到127,double型規定為1023,其表示範圍為-1024到1023。比如對於float型數據,若階碼的真實值為2,則加上127後為129,其階碼錶示形式為10000010。偏差的引入使得對於單精度數,實際可以表達的指數值的範圍就變成 -127 到 128 之間(包含兩端)。我們不久還將看到,實際的指數值 -127(保存為 全 0)以及 +128(保存為全 1)保留用作特殊值的處理。這樣,實際可以表達的有效指數範圍就在 -127 和 127 之間。
- 尾數:有效數字位,即部分二進制位(小數點後面的二進制位),因為規定M的整數部分恆為1,所以這個1就不進行存儲了。
- 比如:125.5這個數
- 先看整數部分,125表示成二進制是1111101,(整數轉換二進制是除二取餘)
- 再看小數部分,0.5表示成二進制是0.1,(小數轉換二進制是乘二取整)
- 所以125.5用二進制表示就是1111101.1,轉換成科學計數法就是1.1111011 x 2^6(階數為6)
- 但是這裡的階碼是用移碼的形式表示,float型的偏置量是127,於是6+127=133,即10000101
- 這裡前面的9位就出來了,因為是正數,所以符號位為0,階碼為10000101
- 後面的尾數就是1111011,在後面補0,湊齊23位,即 1111011 00000000 00000000(因為科學計數法的整數部分總是為1,所以,這個1不用存儲)
- 所以125.5的存儲方式為 0 10000101 11110110000000000000000
- 即: 01000010 11111011 00000000 00000000
double型跟float型計算方式類似,不過區別在於double型遵循IEEE R64.53規範
a、double的符號位是1位,階碼為11位,尾數為52位
b、double的偏置量是1023,而float是127
閱讀更多 學長學姐幫幫學 的文章