让 L 和 B 成为两台机器。 L 从LSB订购位 (最低有效位)到MSB(最高有效位),而 B 顺序 从MSB到LSB。或者,换句话说, L 使用Little Endian B 使用Big Endian 位 - 不要与字节排序混淆。
问题1 已解决:
我们正在编写以下想要移植的代码:
#include <stdio.h>
int main()
{
unsigned char a = 1;
a <<= 1;
printf("a = %d\n", (int) a);
return 0;
}
在 L 上,它会打印2,但 B 会发生什么?它会改变吗? 1出并打印0?。
解决方案: 6.5.7的C99定义说,至少在
无符号整数类型<<
和>>
将乘以除以2
分别
问题2:
我们正在编写以下想要移植的代码:
阅读程序:
/* program READ */
#include <stdio.h>
int main()
{
FILE* fp;
unsigned char a;
fp = fopen("data.dat", "rb");
fread(&a, 1, 1, fp);
fclose(fp);
return 0;
}
和WRITE程序:
/* program WRITE */
#include <stdio.h>
int main()
{
FILE* fp;
unsigned char a = 1;
fp = fopen("data.dat", "wb");
fwrite(&a, 1, 1, fp);
fclose(fp);
return 0;
}
如果我们在 L 上运行WRITE,将数据文件移至 B ,会发生什么 在那里运行READ?如果我们在 B 上运行WRITE,然后在 L 上阅读?
很抱歉,如果这是常见问题解答。我用谷歌搜索了几个小时没有运气。
答案 0 :(得分:7)
Bit Endianness不会以字节为单位影响存储在磁盘上的数据。 Byte Endianness会。
Bit Endianness对于串行接口很重要,其中一次一位地发送一个字节,并且发送方和接收方需要就字节顺序达成一致。例如,SPI设备中的位顺序会有所不同,您需要在尝试从设备读取之前参考数据表。
以下是关于位字节式的Wikipedia所说的内容:
术语位字节序或位级 当时,很少使用字节序 谈论一个代表 储值,因为它们是唯一的 对于罕见的计算机有意义 每个人的架构 bit有一个唯一的地址。他们是 然而,用于指代 比特的传输顺序 串行媒体。最常见的是订单 是由透明管理的 硬件和比特级模拟 小端(低位第一), 虽然存在需要的协议 相反的顺序(例如I²C)。在 网络,关于的决定 进行比特传输的顺序 在数据链接的最底层 OSI模型的一层。
在您的情况下,物理硬盘驱动器接口定义了位顺序,无论处理器是读取还是写入它。
答案 1 :(得分:4)
number>>n
和number<<n
不会左右推动和拉动位。他们将number
除以2^n
。值得注意的是,如果n
为负数或大于number
数据类型的宽度,则不会定义这些变化的行为。
根据C99 standard的第6.5.7节:
E1的结果&lt;&lt; E2是E1左移E2位位置;腾出的位用零填充。 如果E1具有无符号类型,则结果的值为E1×2 ^ E2 ,比结果类型中可表示的最大值减少一个模数。如果E1具有有符号类型和非负值,并且在结果类型中可以表示E1×2 ^ E2,那么这就是结果值;否则,行为未定义。
E1&gt;的结果&gt; E2是E1右移E2位位置。 I f E1具有无符号类型,或者如果E1具有有符号类型和非负值,则结果的值是E1 / 2 ^ E2 的商的整数部分。如果E1具有有符号类型和负值,则结果值是实现定义的。
对于所有编译器关心,这些位可以垂直堆叠:)
答案 2 :(得分:4)
至少就C来说,没有像bit-endianness这样的东西。根据规范,CHAR_BIT
必须至少为8,因此访问任何小于此的对象对于标准C程序来说几乎毫无意义。无论硬件如何存储字节 - LSB或MSB优先 - 它根本不会影响您的程序。在任何一种情况下,myVar & 1
都会返回正确的位。
如果你需要与某种串行接口进行交互并从中重构字节,那就是另一回事了。你自己的机器的'bit-endianness'仍然不会影响任何东西,但接口的位顺序确实如此。
现在,关于您的具体问题以及您展示的计划。您的程序几乎100%便携。 bit-或byte-endianness都不会影响它们。 可能影响他们的是每个平台上CHAR_BIT
是否不同。一台计算机可能会写入比另一台计算机读取的数据更多的数据,反之亦然。
答案 3 :(得分:2)
位移不受字节序的影响。二进制文件I / O通常是,但不是在你的情况下,因为你只写一个字节。
答案 4 :(得分:0)
即
int data;
char charVal;
*data = 1;
charval = *((char *) data); // Different result based on endianness
或者你的例子2,假设你使用的是大于char的类型。