你好,我有一个小端dout和大端的小dout我知道这个问题已经问过n次,但我无法弄清楚以下几点
让我们把int i = 10它作为 00000000 00000000 00000000 00001010
存储在二进制文件中,如下所示: -
00000000 |00000000 |00000000 |00001010 // In case of little endian
MSB-------------------------------------------LSB
大端
00001010 |00000000 |00000000 |00000000 // In case of in big endian
MSB-------------------------------------------LSB
在这个小端和大端都将给出相同的输出10?
那么这些小端和大端的用途是什么?
我被要求实现代码,这些代码可以在我的访谈中对所有大小系统都是可移植的 . 我回答说:
编译器将自己做,如果int i = 10 in little endian,那么在big endian中它也是10作为输出
这个答案是否正确?
4 回答
无论数据是以big endian还是little endian模式存储,大多数情况下,只有当你试图通过指针访问内存中较小部分的变量时才会很重要,就像试图通过a访问32位整数的最低有效字符一样指向字符的指针或带有字符数组的联合 . 另一个问题的例子是,如果您将文件中的数据直接读取到32位整数数组中,或者从32位整数数组中读取数据 . 文件中的数据通常也以小端或大端模式存储 .
据我所知,没有通用的编译时方法来确定cpu是以big endian模式还是little endian模式运行(特定的编译器可能已为此定义) . 您可以使用32位整数的并集和大小为4的字符数组来编写测试代码 . 然后将union中的整数设置为10,并检查union字符数组[0]是否包含10表示小端模式,或者如果联合字符数组[3]包含10,这意味着大端模式 . 可以使用其他方法来确定CPU是处于小端还是大端模式 .
一旦确定cpu是处于小端还是大端模式,就可以包含条件代码来处理这两种情况,例如来自/来自32位整数数组的文件I / O.如果您希望文件数据处于大端模式,但您的cpu处于小端模式,则必须在写入之前或从文件读取之后反转每个整数的字节 .
无论cpu模式如何,您还可以编写代码序列以大端模式存储数据 . 如果已经处于大端模式,它将浪费时间,但它适用于大端和小端模式:
只是为了校正整数图:
int i = 10;
在little endian中, Least Significant Byte (LSB)存储在最低内存地址中 .
在big endian中, Most Significant Byte (MSB)存储在最低内存地址中 .
字节顺序在以下情况下很重要:
您正在直接检查/操作多字节类型的字节
您正在序列化二进制数据,或在不同体系结构之间传输二进制数据
Directly examining/manipulating bytes in a multi-byte type
例如,假设您要拆分并显示32位IEEE浮点的二进制表示 . 下面显示了float和big-little-endian体系结构中float的布局和相应字节的地址:
符号位在float的最高有效字节(MSB)中 . 在大端系统上,MSB位于字节
A
;在一个小端系统上,它位于字节A+1
的中间位置 .因此,如果要屏蔽符号位,可以执行以下操作:
Serializing or transferring binary data
再举一个例子,你想保存二进制(非文本)数据,以便它可以被大端或小端系统读取,或者你_1164199_ net,你会使用像
htonl
这样的调用(主机到网络长)和htons
(主机到网络短路)在发送数据之前执行任何必要的字节交换:在像x86这样的小端系统上,
htonl
会将host_value
的字节从0,1,2,3重新排序为3,2,1,0并将结果保存到network_value
. 在大端系统上,htonl
基本上是无操作系统 . 逆操作是ntohl
和ntohs
.如果您没有做上述任何事情,那么您通常不必担心字节序 .
首先:你实际上混淆了大端和小端字节顺序,正如@rcgldr's和@Galik's答案中所指出的那样 . 正如您在样本中显示的那样,字节顺序完全相反:
至于你的假设和问题:
这取决于你所指的 kind of output .
"10"
)在任何情况下:如果应在具有不同字节顺序的主机上读取文件,则后一个示例将不起作用 .
为了解决这些问题,有htonl(), ntohl()函数族 . 通常,人们同意使用网络字节顺序(big-endian)格式来存储二进制数据或通过网络发送它 .
这是一个简短的示例,如何使用上面提到的字节顺序转换函数:
不同格式的原因(使用)是,有不同的CPU架构,使用不同的方式在内存中表示整数值,这取决于访问它们的特定硬件设计的最有效方式 .
有's no worse/better for these architectural differences, that'为什么它被称为endianess . 这个造币的起源来自Johnatan Swift的小说"Gulliver's travels",并且是Daniel Cohen的文章_1564221中提到的第一个(?) .
好吧,正如你从上面的例子中看到的那样,这个答案是错误的 .