了解 uint32_t 字符类型转换(字节)
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 中是 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 内存后,如第 2 行所示。
现在,如果你加 8,它将到达第 8 个位置,这意味着 02
之后,为什么,因为 (char*)array + 8
被视为 type+8
。这里 type
是 char
。所以它只移动了 8 个字节。
然后从 8 到 35 的内存类型大小写为 uint32_t,第一个值存储在 *value
中。所以它只会3
。
假设我们有这个:
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 中是 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 内存后,如第 2 行所示。
现在,如果你加 8,它将到达第 8 个位置,这意味着 02
之后,为什么,因为 (char*)array + 8
被视为 type+8
。这里 type
是 char
。所以它只移动了 8 个字节。
然后从 8 到 35 的内存类型大小写为 uint32_t,第一个值存储在 *value
中。所以它只会3
。