物件的 Address 與 byte 排列方式
·168 字·1 分鐘
目錄
一個物件的 Address 是代表什麼呢?電腦又是如何處理 multi-byte 的物件呢?
#include <stdio.h>
typedef unsigned char *byte_pointer;
void show_bytes(byte_pointer start, size_t len) {
size_t i;
for (i = 0; i < len; i++)
printf(" %.2x", start[i]); //line:data:show_bytes_printf
printf("\n");
}
void show_int(int x) {
show_bytes((byte_pointer) &x, sizeof(int)); //line:data:show_bytes_amp1
}
int number = 42;
int *ptr = &number;
show_int(number)
printf("Value of number: %d\n", number);
printf("Address of number: %p\n", (void *)&number);
printf("Value of ptr: %p\n", (void *)ptr);
printf("Value pointed to by ptr: %d\n", *ptr);
// 2a 00 00 00
// Value of number: 42
// Address of number: 0x16af374cc
// Value of ptr: 0x16af374cc
// Value pointed to by ptr: 42
Address #
一個物件的 address 代表的是該物件第一個記憶體的位置。
number 的類別是 int ,在一般未指定的情況之下會用 4 個 byte 來表示。
從上面的程式碼以及圖 1.1 可以知道,number(類別是 int
)的 address 是 0x16af374cc
。電腦知道這個 address 與 type 之後就能夠完整的讀取這個值。
Endianness #
不同的機器對於物件 byte 的排列方式也有不同。
舉例來說,number 的值為 42
用 hex notation 表示為 0x0000002a
。
Big endian 會從最高位的 byte 開始排列,Little endian 則相反,從最末位的 byte 開始排列。(詳見圖 1.1)
Endianess 只對於 multi-byte 的物件有影響(如
int
, floats
)現在大部分的電腦都是使用 Little endian 比較多。但網路傳輸相關機器還是會使用 Big endian 。
複製上面的程式碼在你的電腦上跑跑看,看看你的電腦是 Big endian 還是 Little endian ?