我应该担心大结局,还是只是一个微不足道的方面
Should I worry about Big Endianness or is it only a trivial aspect?
有很多计算机使用Big Endian吗?我刚刚在5台不同的电脑上进行了测试,每台电脑都是在不同的年份购买的,型号也不同。每个人都用小恩迪亚。Big Endian现在还在使用吗?还是用于摩托罗拉6800等旧处理器?
编辑:
感谢TreeA,intel.com/design/intach/papers/endian.pdf是一篇非常好用的文章。它涵盖了下面的每一个答案,并对它们进行了扩展。
目前使用的许多处理器都是大端序处理器,或者允许在大端序和小端序之间切换端序模式(例如SPARC、PowerPC、ARM、Itanium..)。
这取决于你所说的"关心endian"是什么意思。如果您只对所需的数据进行编程,通常不需要特别关心endianes。当你需要与外部世界通信时,比如读/写文件,或者通过网络发送数据时,Endian很重要,你可以通过直接向内存读/写大于1字节的整数来实现这一点。
当你确实需要处理外部数据时,你需要知道它的格式。其格式的一部分是例如知道整数是如何在该数据中编码的。如果格式指定一个4字节整数的第一个字节是该整数的最高有效字节,那么您可以读取该字节并将其放在程序中该整数的最有效字节处,就可以完成此操作使用在小端和大端机器上运行的代码。
因此,与其说它是关于处理器端序的,不如说它是你需要处理的数据。这些数据可能有整数存储在"endian"中,你需要知道是哪个,各种数据格式将使用各种endianes,这取决于某些规范,或者取决于提出格式的人的突发奇想。
就不同的体系结构而言,大端序仍然是迄今为止使用最多的。事实上,除了Intel和旧的DEC计算机之外,我不知道有什么小的endian:Sparc、Power PC(IBM Unix机器)、HP的Unix平台、IBM大型机等都是big endian。但这有关系吗?我唯一一次考虑endianness是在实现一些低级系统例程时,比如modf
。否则,int
是某个范围内的整数值,仅此而已。
以下常见平台使用big-endian编码:
- Java
- TCP/UDP数据包中的网络数据(甚至可能在IP级别,但我不确定)
x86/x64 CPU是小端序。如果您要在二者之间使用二进制数据进行接口,那么您绝对应该意识到这一点。
这与其说是一个答案,不如说是一篇评论,但我不能发表评论,我认为这是一篇很好的文章,值得一读。
这是Danny Cohen关于endianness的经典作品,可追溯到1980年:关于HOLY WARS和和平的PLEA
这个问题没有足够的上下文。一般来说,您应该始终意识到这一点,但在日常编码中不需要过于强调它。如果您打算扰乱整数的内部字节,请开始担心端序性。如果你打算对整数进行标准数学运算,不要担心
endianness弹出的两个主要地方是网络(big-endian标准)和二进制记录(必须研究整数是存储big-endia还是存储little-endian)。
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 运行同一解决方案的另一个项目的项目
- 挂起和取消挂起一个文件DLL
- 用C++中的一个变量定义一个常量
- 函数向量_指针有不同的原型,我可以构建一个吗
- 在c++中用vector填充一个简单的动态数组
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 预处理器:插入结构名称中的前一个行号
- 我在c++代码中生成了一个运行时#3异常
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 从链接列表c++中删除一个项目
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '