記憶體地址中的16進位制最小單位是1bit,1Byte?

Docker發表於2019-05-10

在研究 union的時候遇到一個題目,是關於大小端的問題,從而牽扯出了探索記憶體地址的問題

#include <stdio.h>

static union {
    int i;
    char a[2];
} abc;

int main() {
    abc.a[0] = 10; // 低
    abc.a[1] = 1; //高
    printf("%d
", abc.i); //266  10a
    return 0;
}

一般機器為小端,所以當小端的時候這裡的結果為266.

為什麼那?

首先這裡是union共用體,所以大小為 sizeof(int).
比如地址有4個編號,1,2,3,4 分別表示低->高, 由於這裡是小端,所以1->10(a),2->1(1),3->0(0),4->0(0) 括號內的為16進位制

整體則為: 0x0000010a

自己也就是在 0x0000010a 上面迷糊,為什麼不是0x1a 那?

這裡如果要是知道16進位制每兩位為一個位元組, 就很簡單了.比如說上面4個編號,正好對應那4位元組空間,每個位元組空間依次對應0x0000010a 中的2位,也就是第一個位元組對應0a,第二個位元組對應01,依次類推.

探索

為什麼記憶體地址中的16進位制最小單位是1bit,1Byte?

通過gdb除錯可以看到以下結果:

 0x601038  00000000 00000010 00000001 00001010
 0x601039  00000000 00000000 00000010 00000001

可以知道 記憶體地址 從 0x601038 到 0x601039 之間移動了1,但是二進位制卻8位,我們知道8bit = 1Byte,所以,記憶體地址的16進位制最小單位為1Byte,而不是bit

為什麼16進位制每兩位為一個位元組?

通過gdb除錯可以看到以下結果:

(gdb) x/x  0x601038
0x601038 <_ZL3abc>:     0x00 02 01 0a
(gdb) x/x  0x601039
0x601039 <_ZL3abc+1>:   0x00 00 02 01

通過第一個問題,我們已經知道了 記憶體地址中的16進位制最小單位是 Byte 而不是 bit,
所以這裡的16進位制 0x00 02 01 0a0x00 00 02 01 正好移動了2個字元,也就是 0a,所以可以得出 資料的16進位制沒兩位字元為一個位元組.

什麼叫資料的16進位制那,比如

10進位制 | 16進位制 | 2進位制
131338 | 0x0002010a | 1000000001 00001010
513 | 0x000201 | 1000000001

將一個10進位制,轉化為16進位制資料之後的字元.如果是字元

相關工具

http://tool.lu/hexconvert/

相關文章