gpt4 book ai didi

c++ - 什么使系统小端或大端?

转载 作者:IT老高 更新时间:2023-10-28 21:36:50 25 4
gpt4 key购买 nike

我对系统/cpu/程序的字节顺序感到困惑。
所以我必须问一些问题让我的思路清晰。

问题 1

如果我只在我的 C++ 程序中使用 char 类型:

void main()
{
char c = 'A';
char* s = "XYZ";
}

然后将此程序编译成一个名为a.out的可执行二进制文件。
a.out 可以在 little-endian 和 big-endian 系统上运行吗?

问题 2

如果我的 Windows XP 系统是 little-endian,我可以在 VMWare/VirtualBox 中安装 big-endian Linux 系统吗?什么使系统小端或大端?

问题 3

如果我想写一个字节顺序无关的 C++ 程序,我需要考虑什么?

最佳答案

Can a.out both run on little-endian and big-endian system?

不,因为几乎任何两个具有不同字节序的 CPU 都不会运行相同的指令集。 C++ 不是 Java;你不会编译成可以编译或解释的东西。您编译为特定 CPU 的程序集。字节序是 CPU 的一部分。

但这不属于字节序问题。您可以为不同的 CPU 编译该程序,这些可执行文件将在各自的 CPU 上正常工作。

What makes a system little-endian or big-endian?

就 C 或 C++ 而言,CPU。计算机中不同的处理单元实际上可以有不同的字节序(GPU 可能是大字节序,而 CPU 是小字节序),但这有点不常见。

If I want to write a byte-order independent C++ program, what do I need to take into account?

只要按照 C 或 C++ 的规则玩,就不必关心字节序问题。

当然,您也无法将文件直接加载到 POD 结构中。或者读取一系列字节,假装它是一系列无符号短裤,然后将其处理为 UTF-16 编码的字符串。所有这些都进入了实现定义的行为领域。

“未定义”和“实现定义”的行为是有区别的。当 C 和 C++ 规范说某些东西是“未定义的”时,它基本上意味着可能会发生各种破坏。如果您继续这样做(并且您的程序不会崩溃),您可能会得到不一致的结果。当它说某事由实现定义时,您将获得一致的结果该实现

如果你在 VC2010 中为 x86 编译,当你假设一个字节数组是一个无符号短数组时会发生什么(即:unsigned char *byteArray = ...; unsigned short *usArray = (unsigned short*)byteArray ) 由实现定义。为大端 CPU 编译时,您会得到与为小端 CPU 编译时不同的答案。

一般来说,字节序问题是您可以本地化到输入/输出系统的问题。网络、文件读取等。应该在代码库的末端处理它们。

关于c++ - 什么使系统小端或大端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9237317/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com