字节序和整数变量

3

在 C 语言中,字节序概念让我有些担心。假设我在小端机器上声明一个整数(2 字节),如下:

int a = 1;

并且它被存储为:

Address   value
1000       1
1001       0

在大端模式下,它应该是反过来存储的。现在,如果我执行 &a,那么在两台机器上都应该得到1000。

如果这是正确的,那么如果我存储 int a=1,那么在小端模式下我应该得到a=1,在大端模式下应该得到2^15。这个正确吗?

4个回答

2
只要您不在平台之间传输数据(或通过汇编代码访问数据),数据的表示方式对您来说并不重要。
如果您只使用标准C语言,那么它会被隐藏起来,您无需自己去关注它。如果您在未知的机器之间传递数据(例如,您有一个客户端和一个服务器应用程序通过某个网络进行通信),请使用htonntoh函数将本地字节序转换为网络字节序和网络字节序转换为本地字节序,以避免出现问题。
如果您直接访问内存,则问题不仅是字节序,还包括内存对齐,因此请小心处理。

@prp:不,你可能不会得到1和2^15。如果你的大端机器读取代表在小端机器上写入的0x0001的两个字节数据,则可能会得到0x0100作为十六进制值,或者如果你在小端机器上读取在大端机器上写入的数据。 - Jonathan Leffler
1
无论规则的两个例外:1)任何“互联网”相关的内容,例如IP地址都是“网络字节顺序”(大端)_即使在两台小端机器之间也是如此_。使用适当的包装函数可以隐藏这些实现细节并完全避免这个问题(请阅读文档!)。2)SSE内部函数。如果您不仔细阅读,即使在同一台机器上似乎编写C代码,其中一些函数也可能会出现问题。这是因为例如在_mm_set_ps中,英特尔选择将参数按照大多数“正常思考”的人所期望的方式进行排序。 - Damon

2

在小端和大端模式中,都会返回“第一个”字节的地址。这里所说的“第一个”指的是你示例中的1000,并非最高有效字节或最低有效字节的“第一个”。


1
现在如果我执行&a,那么在小端模式下应该得到1000,在大端模式下应该得到1001。

不是这样的;在两台机器上都会得到地址1000。
如果这是正确的,那么如果我存储int a=1,那么在小端模式下我应该得到a=1,而在大端模式下应该得到2^15。这是正确的吗?
不是的;因为前提条件是错误的。此外,如果您将1分配给变量,然后再次读取该值,您将得到结果1。其他任何结果都会导致严重的混乱。(有时(读回存储的值)不能保证 - 例如,如果多个线程可以修改变量,或者它是嵌入式系统上的I/O寄存器。但是,如果您需要了解这些内容,您会意识到这些问题。)
在大多数情况下,您不需要担心字节序。有一些地方需要注意。套接字网络功能是其中之一;将二进制数据写入将在不同字节序的计算机之间传输的文件是另一个。几乎所有其他时间,您都不必担心它。

0

这是正确的,但不仅限于C语言,任何读写二进制数据的程序都会遇到这个问题。如果数据只在一台计算机上保留,则不会有问题。

此外,如果您从文本文件中读取/写入数据,则不会出现此问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接