目前,我正在一个网络项目中,在将这个长数据(64位)转换为big endian之后再通过套接字发送。为此,我正在使用htobe64(x)函数。在接收方客户端上,我正在使用be64toh(x)函数从big endian转换为主机字节顺序。对于像(132)这样的正数,这很好用,但是当数字为负数(-132)时,上述函数将返回一些晦涩的数字。我很困惑为什么即使在使用上述标准函数时也会发生这种情况。
目前正在ubuntu(linux)计算机上针对客户端和服务器进行测试。
例如,请参见下面的代码。
long a = -132;
cout << "=========" << endl;
cout << "a = " << a << endl;
cout << "htobe64 = " << htobe64(a) << endl;
long b = htobe64(a);
cout << "be64toh = " << be64toh(b) << endl;
cout << "=========" << endl;
输出为:
=========
a = -132
htobe64 = 9007199254740991999
be64toh = 18446744073709551484
=========
对于正数,这很好用。
=========
a = 132
htobe64 = 9511602413006487552
be64toh = 132
=========
最佳答案
函数cout << "be64toh = " << be64toh(b) << endl;
接受并返回be64toh
行base64_t
,因此cout
将位序列打印为无符号。因此,您将看到位序列的无符号解释。通常,带符号的数字以2的恭维方法表示(尽管它可能因硬件而异)。它适用于正数,因为带符号的位是0
,因此位序列是相同的。但是如果是负数,则带符号的位(最左边的位)是1
,如果将这样的位序列解释为无符号的整数,它将为您带来巨大的数字。
如果用以下示例替换语句:cout << "be64toh = " << (long) be64toh(b) << std::endl;
它将整数重新解释为有符号(默认情况下,long为带符号的),那么您将能够看到所需的结果。
因此,字节序转换没有问题,这只是打印例程根据变量类型解释的方式。
关于c++ - 负序转换为负数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62390922/