我对系统/ cpu /程序的字节顺序感到困惑.
所以我必须提出一些问题才能让我明白.
如果我只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系统上吗?
如果我的Windows XP系统是little-endian,我可以在VMWare/VirtualBox中安装大端Linux系统吗?是什么让系统成为little-endian或big-endian?
如果我想编写一个与字节顺序无关的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问题是可以本地化为输入/输出系统的问题.网络,文件读取等.应该在代码库的极端处理它们.
问题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++规则,就像我上面给出的示例一样,不要做任何丑陋的事情.避免未定义的行为,避免类型惩罚...