我想以独立于平台的方式将有符号整数值写入文件。
如果它们是未签名的,我将使用 endian(3) 将它们从主机字节顺序转换为 LE(或 BE)函数族。
虽然我不确定如何处理有符号整数。如果我将它们转换为无符号值,我会丢失符号,因为 C 标准不保证
(int) ((unsigned) -1)) == -1
另一种选择是我将指针转换为该值(即,将字节序列重新解释为无符号),但我不相信在那之后转换字节顺序会给出任何合理的结果。
独立于平台的有符号整数存储的正确方法是什么?
更新:
我知道在实践中,几乎所有架构都使用二补码表示,这样我就可以无损地在有符号整数和无符号整数之间进行转换。然而,这个问题更偏向于理论。
推出我自己的整数表示法(将十进制字母存储为 ascii 字符,或单独存储符号位)当然是一种解决方案。但是,如果有一种方法可以在不完全放弃 native 二进制表示的情况下起作用,我很感兴趣。
最佳答案
最简单的解决方案:
对于写作,只需转换为无符号并使用您的无符号字节序转换函数。
为了读回值,首先将它们读入一个无符号变量,并检查是否设置了高位,并进行一些算术运算以使转换定义明确:
uint32_t temp;
int32_t dest;
if (temp > INT32_MAX) dest = -(int32_t)(-temp-1)-1;
else dest = temp;
作为一个额外的好处,一个好的编译器在一个健全的系统(即一个二进制补码系统,其中实现定义的无符号转换是“正确的”)将首先优化 -(int32_t)(-temp-1 )-1
到 (int32_t)temp
,然后将条件的两个分支(现在都包含相同的代码)优化为没有分支的单个代码路径。
关于c - 有符号整数的平台独立存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7897771/