也许我找不到其他函数,但我发现所有处理字节顺序的函数都只接受无符号变量。我的问题是为什么(或者是否有处理字节顺序和接受有符号变量的函数)?
也许解决方案是使用这些 macro ?宏和上面的函数有什么区别?
最佳答案
由于字节顺序是实现定义的,因此可以安全地假设您在谈论实现而不是 C 标准。查看您发送的链接,我认为您指的是 Linux 和 GNU C 编译器。
然后在此实现下,首先将 signed int
打字为 unsigned int
是安全的,更改字节序并打字回来。
下面是一种方法
union signed_unsigned {
signed long a;
unsinged long b;
} converter;
signed long to_convert = .... //whatever value
converter.a = to_convert;
converter.b = htonl(converted.b);
to_convert = converter.a;
您可以根据需要将其变成宏或函数。
正如@underscore_d 所建议的,另一种将 signed long
转换为 unsigned long
(以及返回)的方法是使用指针转换。这在 C 和 C++ 中都是有效的(尽管在 C++ 中你应该使用 reinterpret_cast
而不是 C 风格的指针转换)。
您可以使用以下方式实现相同的目的。
signed long to_convert = .... //whatever value
unsigned long temp = *(unsinged long*)&to_convert;
temp = htonl(temp);
to_convert = *(signed long*)&temp;
关于c - 仅针对无符号值处理字节顺序的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45484396/