c - 有符号整数的平台独立存储

标签 c types endianness

我想以独立于平台的方式将有符号整数值写入文件。

如果它们是未签名的,我将使用 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/

相关文章:

c - 单行 fprintf 命令是线程安全的吗?

c - 如何从 C 函数中返回值?

python - 定义一个行为类似于打字的自定义类型。Any

Scala Typeclass 具有多个参数错误

c - 结构中的位是否有保证

c - 如何从这个输出中判断字节顺序?

c++ - 整数如何存储在内存中?

c - 如何使用 Math.h 中的 M_LN2

花栗鼠和代码块未定义的引用错误

haskell - 您将如何抽象出这对 "similar shaped"数据类型中的样板文件