签名二进制表示是否可以在架构之间移植?

时间:2014-04-05 09:30:35

标签: c++ c x86 arm

我想在字符流中通过网络发送有符号整数,和/或以便携式二进制表示形式将它们保存到磁盘。

当我分配一个变量(我使用long long,64位,有符号)时,普通二进制表示是否存储在内存中,被认为可以在不同的机器架构和操作系统之间移植?

例如,ARM机器上的有符号负长整数的二进制表示是否与x86机器上的相同,如果是这样,它是否被认为是利用这一事实的好/可接受的做法?

编辑:我们已经通过使用整数运算来解决字节顺序问题,从LSB端解析整数到字符。我的问题是 2的补码签名表示是否在架构之间是一致的。

2 个答案:

答案 0 :(得分:3)

简而言之: NO ,您不能依赖跨架构的二进制兼容性。不同的主机使用不同的字节顺序(称为endianess)。

要通过网络传输号码,它一般同意使用大端格式(也称为网络字节顺序)。如果两台机器也使用大端格式,他们将自动利用这一点。对于ARM体系结构,需要转换字节顺序。

要从网络转换为主机字节顺序,反之亦然,您可以使用ntohl()中的ntohs()htonl()htons()arpa/inet.h函数系列。

答案 1 :(得分:1)

在C / C ++中,整数不是“设计可移植的”;您可能会遇到endianness个问题。 无关与他们签名或未签名。

如果您正在编写此软件,请确保以已知字节顺序发送整数。接收部分需要以相同的顺序读取它们,并在必要时执行字节序转换。