一千萬個為什麽

搜索

使用C在定點運算中使用32位數據進行64位操作

我遇到了問題。我正在開發一個只支持32位操作的硬件。

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

and I am porting an application which assumes size of int64_t to be 8 bytes. The problem is it has this macro BIG_MULL(a,b) ( (int64_t)(a) * (int64_t)(b) >> 23)

結果總是32位整數,但由於我的系統不支持64位操作,它總是返回操作的LSB,舍入所有結果使我的系統崩潰。

有人可以幫我嗎?

問候, 維卡斯古普塔

最佳答案

您根本無法在32位整數中可靠地存儲64位數據。您必須重新設計軟件以使用32位整數作為可用的最大大小,或者為64位整數提供64位存儲的方法。兩者都不簡單 - 要禮貌。

一種可能性 - 不是一種簡單的方法 - 是創建一個結構:

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

然後,您可以將數據存儲在兩個32位整數中,並對結構的組件進行算術運算。當然,通常,32位乘32位乘法產生64位答案;要完全乘法而不溢出,可能會強制存儲4個16位無符號數(因為16位數可以乘以32位結果而不會溢出)。您將使用函數來完成繁重的工作 - 因此宏成為對函數的調用,該函數接受INT64_t結構的兩個(指向?)並返回一個。

它不會像以前那麽快......但是如果他們在任何地方使用必要的宏,它就有一定的工作機會。

轉載註明原文: 使用C在定點運算中使用32位數據進行64位操作