了解uint32_t char类型转换(字节)

时间:2018-08-24 14:44:07

标签: c casting char uint32-t

让我们说:

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};

有人可以解释吗?

2 个答案:

答案 0 :(得分:2)

初始化数组时,每个初始化程序都会设置数组中的一个元素,而不管每个元素占用多少字节。

您的计算机可能正在使用低端字节序。这意味着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。

答案 1 :(得分:1)

Probable memory layout

您创建的array[9]占用36个字节。如第一行所示,它存储在内存中。 3以我所代表的方式存储(因编译器而异)。

将其类型转换到char存储器后,如第二行所示。

现在,如果您加8,它将到达第8个位置,这意味着在02之后,为什么,(char*)array + 8被视为type+8。这里typechar。因此它只移动8个字节。

然后将从8到35的内存类型转换为uint32_t,并将第一个值存储在*value中。因此只会3