在 x86 架構及 NVIDIA GPU(顯存、寄存器)中,多字節數據統一採用小端模式存儲:高字節位於高地址,低字節位於低地址(即 bit 31 → bit 0 由高地址向低地址排列)。
char4char4 dog;
dog.x // 第 1 個字節(最低地址)
dog.y // 第 2 個字節
dog.z // 第 3 個字節
dog.w // 第 4 個字節(最高地址)
內存實際佈局順序為:w / z / y / x。若通過分量名訪問(.x, .y...),編譯器會自動處理偏移,無需關心存儲順序。
char dog[4] = {0x11, 0x22, 0x33, 0x44};
int cat = *(int*)dog; // cat 的值為 0x44332211,而非 0x11223344
若需按絕對位置(如移位操作)訪問字節,必須遵循小端規則:
uint32_t a = *p;
a & 0xFF // 第 1 字節(最低位)
(a >> 8) & 0xFF // 第 2 字節
(a >> 16) & 0xFF // 第 3 字節
(a >> 24) & 0xFF // 第 4 字節(最高位)
附帶完整 CUDA 測試程序,對比 Host 與 Device 上 char[4] 強轉 int 及 int 拆解為 char[4] 的結果,證明兩者一致均為小端序。
// 關鍵 Kernel 片段
__global__ void addKernel(int *c, char *b) {
char dog[4] = {0x12, 0x34, 0x56, 0x78};
int *temp = (int*)dog;
c[0] = *temp; // GPU 端結果:0x78563412
int dog2 = 0x12345678;
char *q = (char*)&dog2;
b[0] = q[0]; // 0x78
b[1] = q[1]; // 0x56
b[2] = q[2]; // 0x34
b[3] = q[3]; // 0x12
}
運行結果顯示 CPU 與 GPU 輸出完全一致,確認 N 卡同樣遵循小端存儲。