在研究 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 0a
和 0x00 00 02 01
正好移動了2個字元,也就是 0a
,所以可以得出 資料的16進位制沒兩位字元為一個位元組.
什麼叫資料的16進位制
那,比如
10進位制 | 16進位制 | 2進位制
131338 | 0x0002010a | 1000000001 00001010
513 | 0x000201 | 1000000001
將一個10進位制,轉化為16進位制資料之後的字元.如果是字元