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

rog*_*ogi 6 c endianness bit

LB成为两台机器.大号为了其从LSB(最低有效位)到MSB(最高有效位),而从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;
}
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

和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;
}
Run Code Online (Sandbox Code Playgroud)

如果我们在L上运行WRITE ,将数据文件移动到B并在那里运行READ会发生什么?如果我们在B上运行WRITE 然后在L上读取?

对不起,如果这是一个FAQ.我用谷歌搜索了几个小时没有运气.

tom*_*gic 7

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

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

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

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

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