【问题标题】:Hexadecimal representation on little and big endian systems小端和大端系统的十六进制表示
【发布时间】:2021-02-07 13:09:32
【问题描述】:

考虑以下代码:

unsigned char byte = 0x01;

C/C++ 中,十六进制将被视为int,因此将扩展为多于一个字节。因为多于一个字节,如果系统使用小端或大端都有影响。我的问题是这将扩展什么?

如果系统有 int 包含 4 个字节,它将扩展到以下哪个:

0x00000001 或 0x01000000

字节顺序是否会影响到它们中的哪一个?

【问题讨论】:

  • 在这种情况下没关系。 byte 将以任何方式结束 0x01
  • 您实际上是在问int x = 0x01x 的值的结果是什么?或者构成x的字节在内存中的底层值是多少?
  • 我的问题是关于字节的,是否有可能在某些系统上它会被扩展并最终得到值 0,而不是 1。现在我明白它不可能发生,在这种情况下,x 的值是多少?
  • "如果系统有 'int' 包含 4 个字节"。 0x01 in memory 的 32 位表示在 little-endian 系统中为 01 00 00 00,在 bigendian 系统中为 00 00 00 01。什么都没有丢失。如果您存储在一个字节中,则无论如何都是01

标签: c++ c hex endianness


【解决方案1】:

它完全是特定于架构的。编译器根据您计算机的字节顺序生成输出。假设你的微处理器是大端的,编译器会产生;

char x = 0x01; --> 01,
int x = 0x01;  --> 00 00 00 01

另一方面,如果您使用针对 little-endian 的交叉编译器,或者您在 little-endian 机器上编译代码,则会产生;

char x = 0x01; --> 01
int x = 0x01;  --> 01 00 00 00

总之,输出没有标准或默认字节序,输出将特定于编译器所针对的体系结构。

【讨论】:

    【解决方案2】:

    字节顺序无关紧要。字节序仅与值如何存储在内存中有关。但是不管怎么存储,内存中存储的值代表的值都是0x01。

    以值 0x01020304 为例。它可以作为01 02 03 0404 03 02 01 存储在内存中。但在这两种情况下,它仍然是值 0x01020304(或 16 909 060)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-19
      • 1970-01-01
      相关资源
      最近更新 更多