位字节式如何影响C中的按位移位和文件IO?

LB成为两台机器。 L从LSB(最低有效位)到MSB(最高有效位)对其位进行排序,而B从MSB到LSB进行排序。 或者,换句话说, L使用Little Endian而B使用Big Endian – 不要与字节排序混淆。

问题1已解决

我们正在编写以下希望可移植的代码:

#include  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  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  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上读取?

对不起,如果这是常见问题。 我用谷歌搜索了几个小时没有运气。

位端字节不会以字节为单位影响存储在磁盘上的数据。 Byte Endianness会。

比特字节顺序对于串行接口很重要,其中一次一位地发送一个字节,并且发送方和接收方需要就字节顺序达成一致。 例如, SPI器件中的位顺序各不相同,您需要在尝试从器件读取之前参考数据手册。

这是维基百科关于比特字节的说法:

在讨论存储值的表示时,很少使用术语位字节式或位级字节式,因为它们仅对于每个单独位具有唯一地址的稀有计算机体系结构有意义。 然而,它们用于指代串行介质上的位的传输顺序。 大多数情况下,该命令由硬件透明地管理,并且是little-endian(低位优先)的位级模拟,尽管存在需要相反排序的协议(例如I²C)。 在网络中,关于比特传输顺序的决定是在OSI模型的数据链路层的最底部进行的。

在您的情况下,物理硬盘驱动器接口定义位顺序,而不管要读取或写入的处理器。

至少就C而言,实际上没有像bit-endianness这样的东西。 根据规范, CHAR_BIT必须至少为8,因此访问任何小于此的对象对标准C程序来说几乎毫无意义。 无论硬件如何存储字节 – LSB或MSB优先 – 它根本不会影响您的程序。 在任何一种情况下, myVar & 1返回正确的位。

如果你需要与某种串行接口进行交互并从中重构字节,那就是另一回事了。 你自己机器的’bit-endianness’仍然不会影响任何东西,但接口的位顺序确实如此。

现在,关于您的具体问题和您展示的计划。 您的程序几乎100%便携。 bit-或byte-endianness都不会影响它们。 可能影响他们的是每个平台上的CHAR_BIT是否不同。 一台计算机可能会写入比另一台计算机读取的数据更多的数据,反之亦然。

>> (和<< )不向右(或向左)推(拉)位。
它们将(或乘以)除以2。

对于所有编译器关心,这些位可以垂直堆叠:)

位移不受字节序的影响。 二进制文件I / O通常是,但不是在你的情况下,因为你只写一个字节。

除非a)您使用与编写内容不同的类型从内存中读取内容,或者您​​从使用不同字节顺序的机器编写的文件中读取内容时,否则Endianness不会影响您。

 int data; char charVal; *data = 1; charval = *((char *) data); // Different result based on endianness 

或者你的例子二,假设你使用的是大于char的类型。