【问题标题】:Do I need to care about endianness when creating c++ program?创建 c++ 程序时我需要关心字节顺序吗?
【发布时间】:2021-08-18 13:28:14
【问题描述】:

我知道在从二进制文件和网络中读取数据时我应该关心这一点,但是对于源代码呢?如果我分配值,例如int = 42,对字节顺序有影响吗?它会在具有大端顺序的大端机器上编译,然后在小端机器上不能正常工作吗?还是编译器会处理这个?

【问题讨论】:

  • 编程语言与字节序无关。整数值将被传递给以正确方式存储(或检索)它们的 CPU。
  • 编译后的可执行文件必须与部署可执行文件的机器相匹配(运行它的机器)。
  • " 它会在 big endian 机器上以 big endian 排序编译,然后在 little endian 机器上不能正常工作吗?" - 你不能运行为一个架构编译的程序在另一个架构上。您必须为要在其上运行程序的每个架构编译不同的二进制文件。

标签: c++ endianness


【解决方案1】:

尽管它以低级语言着称,但在编写 C++ 代码时,您实际上并不是在为具体的计算机编写代码。

相反,C++ 代码以称为 C++ Abstract Machine 的东西为目标,编译器的工作是将您的程序在该抽象机器上引起的行为转换为导致在实际目标机器上的效果相同。

实际上,大多数编译器都会绕过这一点,将代码半直接转换为最终目标,但这仍然是他们必须尊重的模型。

在我们认为理所当然的其他事情中,字节顺序并不是 C++ 抽象机中存在的概念。正如您所指出的,除非您深入研究原始数据,否则您不必担心。

作为一个极端的例子,以位移运算符>>为例。它在多字节类型的抽象机器上具有明确定义的行为,因此它的行为不能依赖于目标的字节序。位移的不是实际位,而是

【讨论】:

    【解决方案2】:

    当您将程序编译为机器代码时,您必须针对特定的 CPU 架构。构建链将负责生成目标 CPU 可以理解的代码和数据。

    您通常无法在不兼容的 CPU 上执行编译后的程序。 (不是没有仿真。在仿真的情况下,仿真器必须注意二进制表示的差异)

    【讨论】:

      猜你喜欢
      • 2011-01-13
      • 1970-01-01
      • 2011-10-01
      • 2021-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      相关资源
      最近更新 更多