簡體   English   中英

了解uint32_t char類型轉換(字節)

[英]Understanding uint32_t char typecast (Bytes)

可以說我們有這個:

int main()
{

    int32_t* value = (uint32_t*)malloc(sizeof(uint32_t));
    uint32_t array[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};

    *value = *(uint32_t*)((char*)array + 8);

    printf("Value is: %d\n", *value);

    return 0;
}

在這種情況下,該值為3。為什么會這樣呢? 如果我們將uint32_t強制轉換為char,是否表示uint32_t中一個char為4字節,因此

array[9] = {0, 4, !!8!!, 12, 16, 20, 24, 28, 32};

有人可以解釋一下嗎?

初始化數組時,每個初始化程序都會設置數組的元素,而不管每個元素占用多少字節。

您的計算機可能正在使用低端字節序。 這意味着array在內存中看起來像這樣:

-----------------------------------------------------------------
| 1 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 3 | 0 | 0 | 0 | 4 | 0 | 0 | 0 | ...
-----------------------------------------------------------------

|      [0]      |      [1]      |      [2]      |      [3]      | ...

uint32_t類型的每個值的長度為4個字節,最低有效字節在前。

這樣做(char*)array的是管型array (轉換為指針),以一個char * ,所以在任何指針運算char *通過的尺寸增加的地址char ,也就是1。

所以(char*)array + 8點在這里:

(char*)array + 8 ------------------
                                  v
-----------------------------------------------------------------
| 1 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 3 | 0 | 0 | 0 | 4 | 0 | 0 | 0 | ...
-----------------------------------------------------------------

|      [0]      |      [1]      |      [2]      |      [3]      | ...

然后將該指針轉換為uint32_t *並取消引用,因此它讀取值3。

可能的內存布局

您創建的array[9]占用36個字節。 如第一行所示,它存儲在內存中。 我所代表的3存儲區(因編譯器而異)。

在將其類型轉換到char存儲器后,將看到第二行所示。

現在,如果添加8,它將到達第8個位置,這意味着在02之后,這是因為(char*)array + 8被視為type+8 這里的typechar 因此它僅移動8個字節。

然后將8到35的內存類型轉換為uint32_t,並將第一個值存儲在*value 所以只有3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM