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

时间:2011-03-30 23:03:44

标签: c endianness bit

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 上阅读?

很抱歉,如果这是常见问题解答。我用谷歌搜索了几个小时没有运气。

5 个答案:

答案 0 :(得分:7)

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

Bit Endianness对于串行接口很重要,其中一次一位地发送一个字节,并且发送方和接收方需要就字节顺序达成一致。例如,SPI设备中的位顺序会有所不同,您需要在尝试从设备读取之前参考数据表。

以下是关于位字节式的Wikipedia所说的内容:

  

术语位字节序或位级   当时,很少使用字节序   谈论一个代表   储值,因为它们是唯一的   对于罕见的计算机有意义   每个人的架构   bit有一个唯一的地址。他们是   然而,用于指代   比特的传输顺序   串行媒体。最常见的是订单   是由透明管理的   硬件和比特级模拟   小端(低位第一),   虽然存在需要的协议   相反的顺序(例如I²C)。在   网络,关于的决定   进行比特传输的顺序   在数据链接的最底层   OSI模型的一层。

在您的情况下,物理硬盘驱动器接口定义了位顺序,无论处理器是读取还是写入它。

答案 1 :(得分:4)

number>>nnumber<<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)

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

int data;
char charVal;

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

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

相关问题