計算機中整數的存盤與大小端
文章目錄
- 計算機中整數的存盤與大小端
- 原碼、反碼與補碼
- 進制
- 二進制的原碼、反碼和補碼
- 大小端模式
原碼、反碼與補碼
進制
日常生活中使用的數字一般都是使用十進制來描述的,而在計算機世界里,資料是以二進制的形式存盤的,
關于計數系統和進制,以下是相關資料給出的描述:
在基數b的位置記數系統(其中b是一個正自然數,叫做基數,b個基本符號(或者叫數字)對應于包括0的最小b個自然數, 要產生其他的數,符號在數中的位置要被用到,最后一位的符號用它本身的值,向左一位其值乘以b,一般來講,若b是基底,我們在b進制系統中的數表示為
的形式,并按次序寫下數字a0a1a2a3…ak,這些數字是0到b-1的自然數 ,? ------摘錄于百度百科
一般情況下,在b進制系統中,資料可以寫成以下形式1:

比如,對于整數255,用十進制表示如下:
255
=
2
?
1
0
2
+
5
?
1
0
1
+
5
?
1
0
0
255=2*10^2+5*10^1+5*10^0
255=2?102+5?101+5?100
用八進制表示如下:
255
=
3
?
8
2
+
7
?
8
1
+
7
?
8
0
255=3*8^2+7*8^1+7*8^0
255=3?82+7?81+7?80
用十六進制表示如下:
255
=
15
?
1
6
1
+
15
?
1
6
0
255=15*16^1+15*16^0
255=15?161+15?160
用二進制表示如下:
255
=
1
?
2
7
+
1
?
2
6
+
1
?
2
5
+
1
?
2
4
+
1
?
2
3
+
1
?
2
2
+
1
?
2
1
+
1
?
2
0
255=1*2^7+1*2^6+1*2^5+1*2^4+1*2^3+1*2^2+1*2^1+1*2^0
255=1?27+1?26+1?25+1?24+1?23+1?22+1?21+1?20
于是,可以省略權重,統一處理,以達到簡記數字的目的,
| 十進制 | 八進制 | 十六進制 | 二進制 |
|---|---|---|---|
| 255 | 377 | FF | 11111111 |
二進制的原碼、反碼和補碼
整數有正負之分,一個整數存盤在二進制中也要分正負分別存盤,對應于不同的存盤規則,整數的二進制表示有三種形式:原碼,反碼,補碼,
- 對于正數而言,其原碼、反碼和補碼相同,直接按照其原始二進制位寫出即可,最高位為0,

-
對于負數而言,原碼是直接按照原二進制位寫出,其最高位是1,
-
符號位不變,其他位按位取反得到反碼,
-
反碼加1得到補碼,

-
整數在記憶體中是以補碼的形式存盤的,
-
對整數的運算等操作也是針對補碼進行的,
-
而從記憶體中讀取資料時,編譯器讀取的是轉換后的原碼,
下面通過一個小案例來說明整數的寫入和取出:
int main()
{
int a = -3;
int b = 2;
printf("%d\n", a + b); //以有符號的形式取出并列印
printf("%u\n", a + b); //以無符號的形式取出并列印
return 0;
}
程式運行結果:

程式運行結果顯示,不同的讀取方式得到的結果完全不同!
下面對這一結果的必然性進行分析解剖:
1、先要把資料a和b以補碼的形式存盤在記憶體塊中;
2、 直接對補碼進行二進制計算;
3、計算得到的直接結果是一個補碼;

4、得到計算后的值,需要轉換成用戶能直接看懂或需要的值,即轉換成需要型別的原碼,

對于直接計算的得到的補碼,有兩種解讀形式供用戶選擇,即上圖所示的路徑1和路徑2,
- 以無符號整型取出,沒有符號位的概念,直接以該補碼讀出二進制;
- 以有符號位整型取出,最高位是符號位,其中1代表負數,0代表正數,然后按照前面所介紹的正負數的原反補之間的關系轉換成二進制原碼即可,
據以上分析,第一次列印的是一個非常大的無符號整數,第二次列印的是-1.
大小端模式
對于同一整型資料而言,在記憶體中存盤的排列方式會影響用戶讀取資料或操縱程式以達到目標需求,
對于大小端的處理也和編譯器的實作有關,在C語言中,一般默認是小端; Java是平臺無關的,默認是大端,在網路上傳輸資料普遍采用的都是大端2,
以下是一個案例:
| 十進制 | 二進制 | 十六進制 |
|---|---|---|
| 287,454,020 | 1 0001 0010 0010 0011 0011 0100 0100 | 0x 1122 3344 |
對于這么一個整型資料的存盤,在不同的存盤模式下,其在記憶體空間的布局是不一樣的,

- 把一個數字的低位位元組的內容存放在記憶體的低地址處,把高位位元組的內容存放在高地址處的存盤方式叫小端位元組序存盤;
- 反之,把一個數字的低位位元組的內容存放在記憶體的高地址處,把高位位元組的內容存放在低地址處的存盤方式叫大端位元組序存盤,
在除錯狀態下,通過對記憶體進行監視,可以發現VS編譯器對記憶體地址的使用是小端模式:

好啦,今天的分享到此結束咯,希望小伙伴們都識訓滿滿哦~~

田祖偉, 孫光, 楊素萍. 進制轉換的快速方法及應用[J]. 電腦編程技巧與維護, 2008(17):28-29. ??
位元組存放順序:大尾, 小尾. ChinaUnix. ??
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/300514.html
標籤:其他
上一篇:輾轉相除法證明

