快轉到主要內容
  1. 文章/

物件的 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

1.1

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 ?