首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >unsigned char array到unsigned int通过memcpy返回到unsigned char array是颠倒的

unsigned char array到unsigned int通过memcpy返回到unsigned char array是颠倒的
EN

Stack Overflow用户
提问于 2009-10-18 15:52:20
回答 5查看 4.4K关注 0票数 4

这不是跨平台代码...所有内容都在同一个平台上执行(即字节顺序是相同的..小字节序)。

我有这样的代码:

代码语言:javascript
复制
    unsigned char array[4] = {'t', 'e', 's', 't'};

    unsigned int out = ((array[0]<<24)|(array[1]<<16)|(array[2]<<8)|(array[3])); 
    std::cout << out << std::endl;

    unsigned char buff[4];
    memcpy(buff, &out, sizeof(unsigned int));

    std::cout << buff << std::endl;

我希望buff的输出是"test“(因为缺少‘/0’,所以带有一个垃圾尾随字符),但实际上输出是”tset“。显然,改变我要移动的字符的顺序(3,2,1,0,而不是0,1,2,3)可以解决这个问题,但我不理解这个问题。memcpy的行为不符合我的预期吗?

谢谢。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-10-18 07:56:44

这是因为你的CPU是little-endian。在内存中,数组存储为:

代码语言:javascript
复制
      +----+----+----+----+
array | 74 | 65 | 73 | 74 |
      +----+----+----+----+

这是用右边递增的字节地址表示的。但是,整数存储在内存中,最低有效字节在左侧:

代码语言:javascript
复制
    +----+----+----+----+
out | 74 | 73 | 65 | 74 |
    +----+----+----+----+

这恰好表示整数0x74657374。使用memcpy()将其复制到buff中会反转原始array中的字节。

票数 9
EN

Stack Overflow用户

发布于 2009-10-18 07:56:35

您是在一个小端平台上运行这个程序的。

在小端平台上,32位整数存储在内存中,最低有效字节位于最低内存地址。因此位0-7存储在地址P中,位8-15存储在地址P+ 1中,位16-23存储在地址P+2中,位24-31存储在地址P+ 3中。

在您的示例中:位0-7 = 't',位8-15 = 's',位16-23 = 'e',位24-31 = 't‘

这就是字节写入内存的顺序:"tset“

如果您将内存寻址为单独的字节(无符号字符),则将按照它们写入内存的顺序读取它们。

票数 2
EN

Stack Overflow用户

发布于 2009-10-18 07:58:45

在小端平台上,输出应该是tset。原始序列是从较低地址到较高地址的test。然后你把它放到一个unsigned int中,第一个't‘进入最高有效字节,最后一个't’进入最低有效字节。在小端机器上,最低有效字节存储在较低的地址。这就是将其复制到最终buf的方式。这就是它的输出方式:从最后一个't‘到第一个't',即tset

在大端机器上,您不会观察到这种反转。

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

https://stackoverflow.com/questions/1584296

复制
相关文章

相似问题

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