我遇到了一个问题。我正在开发仅支持 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/