【发布时间】:2021-01-29 14:20:09
【问题描述】:
快速提问,
我想将一个 3 字节带符号二进制补码数组转换为 little-endian int32
我尝试将 memcpy 的大小设置为 3 并将 +1 设置为目标地址(不要忘记将我的 int32 初始化为零)
这是我的代码:
int main(void)
{
// little endian 3 bytes
__uint8_t n1[]={0,0xFF,0xDE,0x81};
__uint8_t n2[]={0xFF,0xDE,0x81};
// temp var
__int32_t tmp1=0;
__int32_t tmp2=0;
// cast array to int
memcpy(&tmp1,n1,4);
memcpy((&tmp2)+1,n2,3);
// printf
printf("n1 : %d\n",tmp1);
printf("n2 : %d\n",tmp2);
}
我得到的输出:
n1 : -2122195201
n2 : 0
我想要的输出:
n1 : -2122195201
n2 : -2122195201
我该如何解决这个问题?也许使用 union 更好?
【问题讨论】:
-
(&tmp2)指向名为tmp2的__int32_t。(&tmp2)+1指向下一个__int32_t的位置,因为指针运算以指向类型为单位进行操作。要指向__int32_t的第一个字节,请转换指针,与(char *) &tmp2一样。然后,要指向下一个字节,请使用((char *) &tmp2) + 1。这就是说,像这样将三个字节复制到 32 位int是非常不寻常的。它通常不是一个好的程序的一部分。