使用 int64 和 int32 指针很难转换
Difficult cast with int64 and int32 pointers
我有int64_t value1; int32_t value2;
。然后我有 *(int32_t*)&value1 = value2;
您能描述一下 *(int32_t*)&value1
是什么意思吗?是不是表示 "the lowest 32 bits of value1" 所以 *(int32_t*)&value1 = value2;
表示 "the first 32 bits of value1 are replaced with those of value2"?
还是我完全错了?
这将取决于它运行的机器的字节顺序。这是很糟糕的做法。
在大多数 Intel 硬件的小端系统上,最低位字节在前,因此 32 位 SIGNED 值将写入 64 位整数的低 32 位。在大端系统上,它将写入高位。
请注意,int 是有符号的。如果 value2 为负值,则生成的 64 位数字将不是负数(除非它已经是负数)。
它也不会更改 64 位 int 的高位。
我会说...不要那样做?
编辑
更直接地回答你的问题,是的,你是对的,取决于你的意思"first 32 bits"。首先,无论平台使用什么顺序,是的。
&value1 -> will give the address of value1
(int32_t*)&value1 -> tells the compiler to treat the address of value1 as a pointer to an int32_t
*(int32_t*)&value1 -> then dereference the pointer, so assigning to this will put the assigned value into the address of value1 as if it were an int32_t.
我有int64_t value1; int32_t value2;
。然后我有 *(int32_t*)&value1 = value2;
您能描述一下 *(int32_t*)&value1
是什么意思吗?是不是表示 "the lowest 32 bits of value1" 所以 *(int32_t*)&value1 = value2;
表示 "the first 32 bits of value1 are replaced with those of value2"?
还是我完全错了?
这将取决于它运行的机器的字节顺序。这是很糟糕的做法。 在大多数 Intel 硬件的小端系统上,最低位字节在前,因此 32 位 SIGNED 值将写入 64 位整数的低 32 位。在大端系统上,它将写入高位。
请注意,int 是有符号的。如果 value2 为负值,则生成的 64 位数字将不是负数(除非它已经是负数)。
它也不会更改 64 位 int 的高位。
我会说...不要那样做?
编辑 更直接地回答你的问题,是的,你是对的,取决于你的意思"first 32 bits"。首先,无论平台使用什么顺序,是的。
&value1 -> will give the address of value1
(int32_t*)&value1 -> tells the compiler to treat the address of value1 as a pointer to an int32_t
*(int32_t*)&value1 -> then dereference the pointer, so assigning to this will put the assigned value into the address of value1 as if it were an int32_t.