是什么让系统成为little-endian或big-endian?

kev*_*kev 13 c++ endianness

我对系统/ cpu /程序的字节顺序感到困惑.
所以我必须提出一些问题才能让我明白.

问题1

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

void main()
{
    char c = 'A';
    char* s = "XYZ";    
}
Run Code Online (Sandbox Code Playgroud)

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

问题2

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

问题3

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

Nic*_*las 20

a.out可以运行在little-endian和big-endian系统上吗?

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

但这不是endian问题.您可以为不同的CPU编译该程序,这些可执行文件可以在各自的CPU上正常工作.

是什么让系统成为little-endian或big-endian?

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

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

只要您按照C或C++的规则进行游戏,就不必关心字节序问题.

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

"未定义"和"实现定义"行为之间存在差异.当C和C++规范说某些东西是"未定义的"时,它基本上意味着所有破碎都可以随之发生.如果你继续这样做(并且你的程序没有崩溃),你可能会得到不一致的结果.当它表示实现定义了某些内容时,您将获得该实现的一致结果.

如果在VC2010中编译x86,那么当你假装一个字节数组是无符号短数组(即:)时,会发生什么unsigned char *byteArray = ...; unsigned short *usArray = (unsigned short*)byteArray.在编译big-endian CPU时,你会得到与编译little-endian CPU时不同的答案.

通常,endian问题是可以本地化为输入/输出系统的问题.网络,文件读取等.应该在代码库的极端处理它们.


Mys*_*ial 8

问题1:

a.out可以运行在little-endian和big-endian系统上吗?

a.out不会.因为它已针对它所针对的任何架构进行编译.它不会在与其不兼容的另一个架构上运行.

但是,该简单程序的源代码没有什么可能在不同的端机器上破坏.

所以它是(源)将正常工作.(嗯......除了void main(),你应该使用它int main())

问题2:

如果我的WindowsXP系统是little-endian,我可以在VMWare/VirtualBox中安装大端Linux系统吗?

Endian-ness由硬件决定,而不是OS.因此,无论您在其上安装什么(本机)VM,它都将与主机相同.(因为x86都是小端)

是什么让系统成为little-endian或big-endian?

这是一个在小端与大端上表现不同的东西的例子:

uint64_t a = 0x0123456789abcdefull;
uint32_t b = *(uint32_t*)&a;
printf("b is %x",b)
Run Code Online (Sandbox Code Playgroud)

*请注意,这违反了严格别名,仅用于演示目的.

Little Endian : b is 89abcdef
Big Endian    : b is 1234567
Run Code Online (Sandbox Code Playgroud)

在little-endian上,低位a存储在最低地址.因此,当您a以32位整数访问时,您将读取它的低32位.在big-endian上,您将读取高32位.

问题3:

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

只需遵循标准的C++规则,就像我上面给出的示例一样,不要做任何丑陋的事情.避免未定义的行为,避免类型惩罚...