字节序和整数变量

时间:2011-04-13 05:33:10

标签: c endianness

在c中,我对endianess的概念感到担忧。假设我在一个小端机器上声明一个整数(2个字节)为

int a = 1;

,它存储为:

Address   value
1000       1
1001       0

在big endian上,它应该存储,反之亦然。现在,如果我做了& a那么我应该在两台机器上获得1000.

如果这是真的那么如果我存储int a=1那么我应该在小端上获得= 1而在大端上获得2 ^ 15。这是对的吗?

4 个答案:

答案 0 :(得分:2)

只要您不在平台之间传输数据(或通过汇编代码访问它),您应该如何表示数据并不重要。

如果您只使用标准C - 它对您隐藏,您不应该为此烦恼。如果您在未知计算机之间传递数据(例如,您有通过某个网络进行通信的客户端和服务器应用程序) - 使用从本地转换为网络,从网络转换为本地的htonntoh函数结束,以避免问题。

如果您直接访问内存,那么问题不仅会是endian而且还会打包,所以请小心。

答案 1 :(得分:2)

在little endian和big endian中,返回“first”字节的地址。这里的“第一个”在你的例子中我指的是1000,而在最重要或最不重要的字节意义上不是“第一”。

答案 2 :(得分:1)

  

现在如果我做&a那么我应该在小端上获得1000,在大端上获得1001。

没有;在两台机器上,您将获得地址1000。

  

如果这是真的那么如果我存储int a = 1那么我应该在小端上获得a = 1而在big endian上获得2 ^ 15。这是对的吗?

没有;因为初步条件是假的。此外,如果您为变量赋值1然后再次读取该值,则返回结果1。其他任何事情都会引起混乱。 (有时候不能保证这个(回读存储的值) - 例如,如果多个线程可以修改变量,或者它是嵌入式系统上的I / O寄存器。但是,你应该知道如果您需要了解它们,请参阅。)

在大多数情况下,您无需担心字节序。你有几个地方。套接字网络功能就是这样的;将二进制数据写入将在不同字节序的机器之间传输的文件是另一种。几乎所有其他时间,你不必担心它。

答案 3 :(得分:0)

这是正确的,但它不仅是c中的问题,而是任何读取和写入二进制数据的程序。如果数据保留在一台计算机上,那就没问题。

此外,如果您正在阅读/写入文本文件,这将不是问题。