复制到较大大小的变量中

Copying into a variable with larger size

本文关键字:变量 复制      更新时间:2023-10-16

我有一个uint8_t (uint8_t mydata[1000])类型的大数组。我只想从这个大数组中复制4字节长的数据。如果我将4个字节的数据复制到64位整数变量中,可以吗?还是应该像uint32_t一样将目标变量定义为4字节长度?

uint8_t mydata[1000];
uint64_t mysentS; //Is this okay when coping 4 bytes of data or should it be uint32_t?
uint64_t mysentUS;
memcpy(&mysentS, &mydata[16], 4);
memcpy(&mysentUS, &mydata[20], 4);

它可以像"它不会崩溃"一样,但它是非常可怕的代码。

假设字符数组中的位置包含一个4个char s中的32位整数,您想将其用作整数,则会遇到需要处理的字节序问题。

目前尚不清楚复制到uint64_t的"第一个"(按地址)字节是否能获得所需的值,这取决于当前机器的字节序。

在小型endian机器上它可以工作,但在大型endian机器中它不会工作。

最好是逐字节提取值,因为这样可以明确每个字节的含义。

/* Extract 32-bit little-endian value. */
mysentS = (mydata[16] << 0)  + (mydata[17] << 8) +
          (mydata[18] << 16) + (mydata[19] << 24);

这是因为在应用移位之前,移位表达式的左侧被提升为unsigned int

这取决于你要做什么。如果你要将4个字节的带符号整数复制到没有符号的整数,或者如果你要跳过endiannes(如果使用了任何endiannes),你会得到不同的结果。对于编译器来说,它看起来不错。