【发布时间】:2011-10-24 18:53:39
【问题描述】:
我正在尝试从 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);
提前致谢
【问题讨论】:
-
CPU 知道如何做小端,你不知道。
-
@Patrick 只要你不与其他机器通信,它们有另一个字节序或者只是做聪明的字节技巧。虽然在大多数情况下您实际上不必为此烦恼,但理解并牢记这一点很重要。
标签: c++ c arrays integer bit-manipulation