我遇到了问题.我正在开发一个只支持32位操作的硬件.
sizeof(int64_t) is 4. Sizeof(int) is 4.
Run Code Online (Sandbox Code Playgroud)
我正在移植一个应用程序,假定int64_t的大小为8个字节.问题是它有这个宏BIG_MULL(a,b)((int64_t)(a)*(int64_t)(b)>> 23)
结果总是一个32位整数,但由于我的系统不支持64位操作,它总是返回操作的LSB,舍入所有结果使我的系统崩溃.
有人可以帮我吗?
此致,Vikas Gupta
您根本无法在32位整数中可靠地存储64位数据.您必须重新设计软件以使用32位整数作为可用的最大大小,或者为64位整数提供64位存储的方法.两者都不简单 - 要有礼貌.
一种可能性 - 不是一种简单的方法 - 是创建一个结构:
typedef struct { uint32_t msw; uint32_t lsw; } INT64_t;
Run Code Online (Sandbox Code Playgroud)
然后,您可以将数据存储在两个32位整数中,并对结构的组件进行算术运算.当然,通常,32位乘32位乘法产生64位答案; 要完全乘法而不溢出,可能会强制存储4个16位无符号数(因为16位数可以乘以32位结果而不会溢出).您将使用函数来完成繁重的工作 - 因此宏成为对函数的调用,该函数接受INT64_t结构的两个(指向?)并返回一个.
它不会像以前那么快......但如果他们在任何地方使用必要的宏,它有一定的工作机会.