在c中,我对endianess的概念感到担忧。假设我在一个小端机器上声明一个整数(2个字节)为
int a = 1;
,它存储为:
Address value
1000 1
1001 0
在big endian上,它应该存储,反之亦然。现在,如果我做了& a那么我应该在两台机器上获得1000.
如果这是真的那么如果我存储int a=1
那么我应该在小端上获得= 1而在大端上获得2 ^ 15。这是对的吗?
答案 0 :(得分:2)
只要您不在平台之间传输数据(或通过汇编代码访问它),您应该如何表示数据并不重要。
如果您只使用标准C - 它对您隐藏,您不应该为此烦恼。如果您在未知计算机之间传递数据(例如,您有通过某个网络进行通信的客户端和服务器应用程序) - 使用从本地转换为网络,从网络转换为本地的hton
和ntoh
函数结束,以避免问题。
如果您直接访问内存,那么问题不仅会是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中的问题,而是任何读取和写入二进制数据的程序。如果数据保留在一台计算机上,那就没问题。
此外,如果您正在阅读/写入文本文件,这将不是问题。