c++ - 使用C在定点运算中使用32位数据进行64位操作

标签 c++ c

我遇到了一个问题。我正在开发仅支持 32 位操作的硬件。

sizeof(int64_t) is 4. Sizeof(int) is 4.  

我正在移植一个假定 int64_t 大小为 8 字节的应用程序。问题是它有这个宏 BIG_MULL(a,b) ( (int64_t)(a) * (int64_t)(b) >> 23)

结果始终是 32 位整数,但由于我的系统不支持 64 位操作,它总是返回操作的 LSB,所有结果的舍入使我的系统崩溃。

有人可以帮帮我吗?

问候, 维卡斯古普塔

最佳答案

您根本无法将 64 位数据可靠地存储在 32 位整数中。您要么必须重新设计软件以使用 32 位整数作为最大可用大小,要么提供一种为 64 位整数提供 64 位存储的方法。两者都不简单 - 对此要有礼貌。

一种可能性 - 不是一种容易的 - 是创建一个结构:

typedef struct { uint32_t msw; uint32_t lsw; } INT64_t;

然后您可以将数据存储在两个 32 位整数中,并对结构的组件进行算术运算。当然,一般来说,32 位乘以 32 位会产生 64 位的结果;要在不溢出的情况下进行完全乘法,您可能被迫存储 4 个 16 位无符号数(因为 16 位数字可以相乘得到 32 位结果而不会溢出)。您将使用函数来完成艰苦的工作 - 因此宏成为对函数的调用,该函数接受两个(指向?)INT64_t 结构并返回一个。

它不会像以前那么快......但如果他们在必要的地方使用宏,它有一些工作的机会。

关于c++ - 使用C在定点运算中使用32位数据进行64位操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2661162/

相关文章:

c++ - 使用 Boost MPI 发送文件?

c++ - 从十进制转换为二进制

c - ARM - 为什么 gcc 为单个字符分配 12 个字节?

c - 斐波那契数列

c - 凯撒密码加密中如何从 'z'返回到 'a'

c - 释放内存——二维数组

c++ - 在 Boost::Program_Options 中,如何设置 wstring 的默认值?

c++ - 在 Qt 中使用完成信号退出线程并进行 clean_up 的正确方法

c++ - 从 std::ostream 重载 << 运算符时,为什么编译器会给出 "too many parameters for this operator function"错误?

C 读取二进制标准输入