reinterpret_cast交换比特?

tet*_*isd 1 c++ reinterpret-cast

当我注意到它的输出完全错误时,我正在测试一个简单的编译器.实际上,输出的字节顺序从小到大都是交换的.仔细检查后,违规代码就是这样的:

const char *bp = reinterpret_cast<const char*>(&command._instruction);
for (int i = 0; i < 4; ++i)
  out << bp[i];
Run Code Online (Sandbox Code Playgroud)

一个四字节的指令被重新解释为一组单字节字符并打印到stdout(它很笨重,是的,但那个决定不是我的).对于我来说,为什么这些位将被交换似乎不合乎逻辑,因为char指针应该首先指向最重要的位(在此x86系统上).例如,给定0x00 ... 04,char指针应指向0x00,而不是0x04.案件是后者.

我创建了一个简单的代码演示:

#include <bitset>
#include <iostream>
#include <stdint.h>

int main()
{
  int32_t foo = 4;
  int8_t* cursor = reinterpret_cast<int8_t*>(&foo);

  std::cout << "Using a moving 8-bit pointer:" << std::endl;
  for (int i = 0; i < 4; ++i)
    std::cout << std::bitset<8>(cursor[i]) << " "; // <-- why?

  std::cout << std::endl << "Using original 4-byte int:" << std::endl;
  std::cout << std::bitset<32>(foo) << std::endl;

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

Using a moving 8-bit pointer:
00000100 00000000 00000000 00000000
Using original 4-byte int:
00000000000000000000000000000100
Run Code Online (Sandbox Code Playgroud)

Kaz*_*Kaz 6

对于我来说,为什么这些位将被交换似乎不合乎逻辑,因为char指针应该首先指向最重要的位(在此x86系统上).

在x86系统上,指向多字节对象基址的指针不指向最高有效字节,而是指向最低有效字节.这称为"小端"字节顺序.

在C中,如果我们获取占用多个字节的对象的地址,并将其转换为char *,则它指向对象的基础:那个被认为是最低有效地址的对象,指针可以从该地址开始替换(使用+++等)以获得其他字节.