首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用int数组的一部分时的字节顺序

使用int数组的一部分时的字节顺序
EN

Stack Overflow用户
提问于 2011-10-25 02:53:40
回答 3查看 1.6K关注 0票数 1

我正在尝试从uint8_t数组中提取值。但我很难理解这些在内存中是如何表示的。

代码语言:javascript
复制
#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;
}

因此,我有一个2元素长的数据类型为uint8_t的数组。我只有一个变量uint16_t。

代码语言:javascript
复制
0000 0001 1111 1111

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

代码语言:javascript
复制
1111 1111 0000 0001 

所以只有“在”每个字节中才使用低字节顺序?由于在tmp11中设置的单个位计为256,即使它在我的流中更“正确”。因此,每个字节(而不是位)的值是bigendian吗?我对此有点困惑。

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

代码语言:javascript
复制
fprintf(stderr,"2x uint8_t as uint16_t  = %u\n",(uint16_t) *tmp1);

提前感谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-25 03:31:43

不要把字节序理解为“在字节内”。可以把它看作是“字节排序”。(也就是说,实际的位排序并不重要,因为人类通常以大端字符顺序读取值。)如果它有助于想象小端机器上的位是颠倒的,那么您可以这样想象。(在这种情况下,您的示例应该看起来像1111 1111 1000 0000,但正如我所说的,人类通常不会读取这样的数字,即最重要的值是right...but,您可能会认为这就是计算机看待事物的方式,如果它能帮助您理解little-endian的话。)

在一台小型endian机器上,正如您所看到的那样,0xAABBCCDD在内存中将被视为0xDD 0xCC 0xBB 0xAA。在大端机器(比如PPC机器)上,您在内存中看到的排序与您写出32位字时看到的排序相同。

票数 1
EN

Stack Overflow用户

发布于 2011-10-25 03:00:46

你对你期望的东西的假设是倒退的。您的观察结果与小端表示法一致。要回答您的最后一个问题,它将如下所示:

代码语言:javascript
复制
fprintf(stderr,"2x uint8_t as uint16_t  = %u\n",*(uint16_t*)tmp1);
票数 4
EN

Stack Overflow用户

发布于 2011-10-25 03:11:35

首先,如果你想100%确定你的变量在内存中的存储顺序是正确的,你应该把它们放在一个结构中。

然后请注意,memcmp()将您提供的输入视为一个字节序列,因为它对您提供的数据的性质没有任何假设。例如,考虑以下代码:

代码语言:javascript
复制
#include <stdio.h>
#include <stdint.h>

int main(int argc, char** argv) {
    int32_t a, b;
    a = 1;
    b = -1;
    printf( "%i\n", memcmp( &a, &b, sizeof( int32_t ) ) );
}

它在我的小端机器上输出-254,而不考虑a> b,这是因为它不知道内存实际是多少,所以它像uint8_t数组一样比较它们。

如果你真的想要可视化数据在你的机器上是如何表示的,你可以首先使用fwrite将一个结构写到文件中,然后用你最喜欢的十六进制编辑器打开它(根据我的经验,如果数据是X-bit Y-endian ingeter,wxHexEditor会很好地告诉你它是什么样子的)。以下是源代码:

代码语言:javascript
复制
#include <stdio.h>
#include <stdint.h>

typedef struct {
    uint8_t tmp1[2];
    uint16_t tmp2;
} mytmp;

int main(int argc, char** argv) {
    mytmp tmp;
    tmp.tmp1[0] = 255;
    tmp.tmp1[1] = 1;
    tmp.tmp2 = 511;

    FILE* file = fopen( "struct-dump", "w" );
    fwrite( &tmp, sizeof( mytmp ), 1, file );
    fclose( file );
}

至于将uint8_t数组视为uint16_t,您可能希望声明一个union或使用指针强制。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7880389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档