gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 17:51:12 24 4
gpt4 key购买 nike

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com