我想在字符流中通过网络发送有符号整数,和/或以便携式二进制表示形式将它们保存到磁盘。
当我分配一个变量(我使用long long,64位,有符号)时,普通二进制表示是否存储在内存中,被认为可以在不同的机器架构和操作系统之间移植?
例如,ARM机器上的有符号负长整数的二进制表示是否与x86机器上的相同,如果是这样,它是否被认为是利用这一事实的好/可接受的做法?
编辑:我们已经通过使用整数运算来解决字节顺序问题,从LSB端解析整数到字符。我的问题是 2的补码签名表示是否在架构之间是一致的。
答案 0 :(得分:3)
简而言之: NO ,您不能依赖跨架构的二进制兼容性。不同的主机使用不同的字节顺序(称为endianess)。
要通过网络传输号码,它一般同意使用大端格式(也称为网络字节顺序)。如果两台机器也使用大端格式,他们将自动利用这一点。对于ARM体系结构,需要转换字节顺序。
要从网络转换为主机字节顺序,反之亦然,您可以使用ntohl()
中的ntohs()
,htonl()
,htons()
,arpa/inet.h
函数系列。
答案 1 :(得分:1)
在C / C ++中,整数不是“设计可移植的”;您可能会遇到endianness个问题。 无关与他们签名或未签名。
如果您正在编写此软件,请确保以已知字节顺序发送整数。接收部分需要以相同的顺序读取它们,并在必要时执行字节序转换。