gpt4 book ai didi

c++ - 使用 int 数组的一部分时的字节顺序

转载 作者:太空宇宙 更新时间:2023-11-04 00:54:20 25 4
gpt4 key购买 nike

我正在尝试从 uint8_t 数组中提取值。但我无法理解这些在内存中的表示方式。

#include <cstdio>
#include <cstring>
#include <stdint.h>
int main(){
uint8_t tmp1[2];
uint16_t tmp2 = 511;//0x01 + 0xFF = 0x01FF
tmp1[0] = 255;//0xFF
tmp1[1] = 1;//0x01
fprintf(stderr,"memcmp = %d\n",memcmp(tmp1,&tmp2,2));


fprintf(stderr,"first elem in uint8 array = %u\n",(uint8_t) *(tmp1+0));
fprintf(stderr,"first elem in uint8 array = %u\n",(uint8_t) *(tmp1+1));

fprintf(stderr,"2xuint8_t as uint16_t = %u\n",(uint16_t) *tmp1);
return 0;
}

所以我有一个数据类型为 uint8_t 的 2 元素长数组。我有一个变量 uint16_t。所以当我在我的小端机器上取值 511 时,我会假设它在内存中的布局为

0000 0001 1111 1111

但是当我使用 memcompare 时,它​​看起来实际上被表示为

1111 1111 0000 0001 

那么小字节序仅在每个字节“内”使用?由于 tmp1[1] 中设置的单个位计为 256,即使它在我的流中更“正确”。每个字节(不是位)的值,因此是 bigendian?我对此有点困惑。

此外,如果我想强制 fprint 打印输出,我的 2xuint8_t 作为单个 uint16_t,我该怎么做。下面的代码不起作用,它只打印出第一个字节。

fprintf(stderr,"2x uint8_t as uint16_t  = %u\n",(uint16_t) *tmp1);

提前致谢

最佳答案

您对预期的假设是倒退的。您的观察与小端表示法一致。要回答你的最后一个问题,它看起来像这样:

fprintf(stderr,"2x uint8_t as uint16_t  = %u\n",*(uint16_t*)tmp1);

关于c++ - 使用 int 数组的一部分时的字节顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7880389/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com