【问题标题】:Understanding uint32_t char typecast (Bytes)了解 uint32_t char 类型转换(字节)
【发布时间】:2019-01-31 01:51:36
【问题描述】:

假设我们有这个:

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,这是否意味着一个 char 在 uint32_t 中是 4 字节,因此

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

有人可以解释一下吗?

【问题讨论】:

  • int32_t* value = (uint32_t*)malloc(sizeof(uint32_t)); 为什么要这样投射?
  • 你为什么要写一些混淆代码,然后问它为什么这样做?
  • 无法复制。我得到 3。
  • @ChristianGibbons 我不确定,但我认为 OP 也获得了 3...
  • 嗯,这实际上是学校的任务,他们使用 malloc 分配空间,还有另一个任务询问问题是什么。好吧,任务中的代码不会释放内存,但这不是重点。是的,我也得到 3,但为什么是 3?

标签: c casting char uint32-t


【解决方案1】:

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

您的机器可能正在使用 little-endian 字节排序。这意味着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。

【讨论】:

  • 感谢您的解释!
【解决方案2】:

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

在您将其类型转换为 char 内存后,如第 2 行所示。

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

然后内存从 8 到 35 类型大小写为 uint32_t,第一个值存储在 *value 中。所以它只会3

【讨论】:

  • 感谢您的解释!
猜你喜欢
  • 1970-01-01
  • 2012-05-25
  • 2018-04-30
  • 2020-11-10
  • 2017-06-27
  • 1970-01-01
  • 1970-01-01
  • 2017-08-14
  • 1970-01-01
相关资源
最近更新 更多