首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

多字節數據存儲順序詳解:小端模式在內存、顯存與寄存器中的體現

     編輯:C++ 入門

核心結論

在 x86 架構及 NVIDIA GPU(顯存、寄存器)中,多字節數據統一採用小端模式存儲:高字節位於高地址,低字節位於低地址(即 bit 31 → bit 0 由高地址向低地址排列)。

直觀示例

1. CUDA 向量類型 char4

char4 dog;
dog.x  // 第 1 個字節(最低地址)
dog.y  // 第 2 個字節
dog.z  // 第 3 個字節
dog.w  // 第 4 個字節(最高地址)

內存實際佈局順序為:w / z / y / x。若通過分量名訪問(.x, .y...),編譯器會自動處理偏移,無需關心存儲順序。

2. 普通數組與整型轉換

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 字節(最高位)

驗證代碼(CPU vs GPU)

附帶完整 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 卡同樣遵循小端存儲。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved