計算機使用二進制來存儲和運算數據
二進制數位上的數字隻能是0和1
一個字節包含8位二進制位
二進制和十進制一樣,隻是一種數字的表示形式
1.二進制和十進制的轉換
整數:
(1)二進制轉換成十進制
二進制數字的每個數位有一個編号,最右邊的編号是0,向左一次遞增
二進制轉換成十進制的結果就是将每個數位上的1乘以2的編号次方,再将所有的結果相加
1234 = 1X10^3 2X10^2 3X10^1 4X10^0
1010111 = 1X2^6 1X2^4 1x2^2 1x2^1 1x2^0
= 64 16 4 2 1 = 87
01110101
= 2^6 2^5 2^4 2^2 2^0 = 64 32 16 4 1
= 117
注:二進制數字中相鄰的1之間有倍數關系,左邊的1是右邊的1的兩倍
(2)十進制轉二進制
方法1:
将十進制的數字拆分成多個非重複的2的整數次方之和,再将每個拆分的結果單獨轉換成二進制,最後将所有的結果合并
79 = 64 8 4 2 1
= 2^6 2^3 2^2 2^1 2^0
= 1000000 1000 100 10 1
= 1001111
方法2:
将十進制的數字不停地除以2,保留餘數,直到商為0,然後把所有的餘數倒着寫,得到的結果就是對應的二進制轉換結果
餘數
103 1
51 1
25 1
12 0
6 0
3 1
1 1
0 ------------停止
結果為 1100111
175 1
87 1
43 1
21 1
10 0
5 1
2 0
1 1
0
結果為 10101111
補充:
使用上述方法得到的是二進制的原碼
計算機中存儲整數實際上存儲的是二進制的補碼
非負數的補碼就是原碼,負數的補碼是他相反正數的原碼取反加1得到
-103
0110 0111 取反------> 1001 1000 加1------> 1001 1001
小數:
(1)二進制轉換成十進制
整數部分直接使用上面整數的轉換方法,小數部分的每個數位也有一個編号,最左邊的小數數位的編号是-1,向右依次遞減
小數二進制轉換成十進制的結果就是将每個數位上的1乘以2的編号次方,再将所有的結果相加
1011011.1011 = 2^6 2^4 2^3 2^1 2^0 2^-1 2^-3 2^-4
= 64 16 8 2 1 0.5 0.125 0.0625
= 91.6875
(2)十進制轉二進制
整數部分直接使用上面整數的轉換方法,将小數部分不停乘以2,每次保留個位并且清0,直到沒有小數部分為止,記錄的個位依次就是二進制的小數部分
137.3725
整數部分:10001001
小數部分:0.0101111....
0.3725 0
0.745 1
0.49 0
0.98 1
0.96 1
0.92 1
0.84 1
......
0
2.浮點數的存儲
浮點數在計算機中的存儲類似于科學計數法
1486.31 --------- 1.48631 X 10^3
首先将小數轉換成二進制,把二進制的小數用類似于科學計數法的方法表示處理
137.375 ------> 10001001.011 ------> 1.0001001011 X 2^7
在計算機中,記錄以上浮點數分别記錄 符号,階碼,尾數
浮點數在計算機中的存儲
假設符号位叫S,階碼叫E,尾數叫M,那麼對應的浮點數的值V
V = (-1)^S X M X 2^E
浮點數存儲的特别規定:
(1)對于尾數M來說,個位永遠是1,不需要記錄他,尾數M隻記錄小數點之後的部分
1.0001001011 ------> 0001001011
(2)對于階碼E來說,由于指數可正可負,需要對階碼進行修正
階碼不全為0或者不全為1,階碼E減去一個數得到真實指數,float類型減去127,double需要減去1023,比如一個float數的階碼為129,對應的指數是129-127 = 2
(3)階碼E全為0,這個時候尾數M不再需要加上前面的1,這種方法用來表示 /-0,或者接近于0的很小的數字
(4)階碼E全為1,如果尾數M全為0,此時表示 /-無窮大,如果尾數M不全為0,此時表示該浮點數非法(NaN)
3.八進制
八進制數位上的數字為0~7,八進制是二進制的簡寫形式
把二進制表示形式從右到左每三個數位分為一組,每一組用一個0-7之間的數字代替,這樣的得到的結果就是數字的八進制表示形式
在C代碼中可以直接使用八進制,但是必須在數字前加0
10 101 111
= 0257
printf打印數字的八進制形式使用占位符%o
4.十六進制
十六進制是二進制的簡寫形式,每個數位上的值是0~15,其中0-9直接用數字,10~15使用字母a~f
把二進制表示形式從右到左每四個數位分為一組,每一組用一個0-9或a-f之間的内容代替,這樣的得到的結果就是數字的十六進制表示形式
在C代碼中可以直接使用十六進制,但是必須在數字前加0x
1010 1111
= 0xaf
printf打印數字的十六進制形式使用占位符%x(小寫) %X(大寫)
配套視頻:深度解析C語言
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!