2011-05-28 128 views
2

我正在研究一個具有32位長整數的小型嵌入式系統。對於一次計算,我需要輸出1970年以來的時間,單位爲毫秒。自1970年以來,我可以在32位無符號長時間內獲得時間,但是我怎樣才能將它表示爲64位數字。毫秒如果我最大的int只有32位?我敢肯定,stackoverflow將有一個狡猾的答案!我使用動態C,接近標準C.我有由具有64位長的長數據類型另一個系統中的一些示例代碼:需要在32位長的機器上執行64位乘法

long long T = (long long)(SampleTime * 1000.0 + 0.5); 
data.TimeLower = (unsigned int)(T & 0xffffffff); 
data.TimeUpper = (unsigned short)((T >> 32) & 0xffff); 
+2

與Google合作的什麼語言? – Vinnyq12 2011-05-28 23:47:14

+0

它是Dynamic C,是嵌入式系統C的一個奇怪的超集 – 2011-05-28 23:54:13

回答

0

的標準方法,假設你有一個16x16-> 32乘法可用,將兩個數字分爲16位高位和低位部分,計算4個部分產品並添加結果。如果你沒有一個16x16-> 32的基元比32x32-> 32基元快,我不確定最好的方法是什麼。我認爲一個32x32-> 32的乘法應該比16x16-> 32的乘法更有用,但我想不出如何使用它。個人而言,我希望有一個標準原語返回NxN乘法的上半部分(32x32,當然; 16x16對於較小的機器也是64x64,對於較大的機器)。

0

如果您更具體地說明您需要執行哪種計算,可能會有所幫助。使用32位操作實現的64位乘法運算速度非常慢,並且您可能需要額外的64位除法開銷(將時間轉換爲秒和毫秒),甚至更慢。

不知道更多關於你到底需要做什麼,在我看來,使用一個結構會更有效率,它包含一個32位無符號整數的秒數和一個16位整數毫秒數(「餘數」)。 (或者如果64位對齊比保存幾個字節更重要,則使用32位整數)。

+0

我添加了一些來自另一個系統的示例代碼,它有一個64位長的長類型 – 2011-05-29 01:15:43

1

由於您只乘以1000(秒 - >毫秒),所以可以用兩個16位mutliplies和一個增加和點滴擺弄的,我用你的推測的數據類型來存儲下面的結果:

uint32_t time32 = time(); 
uint32_t t1 = (time32 & 0xffff) * 1000; 
uint32_t t2 = ((time32 >> 16) * 1000) + (t1 >> 16); 
data.TimeLower = (uint32_t) ((t2 & 0xffff) << 16) | (t1 & 0xffff); 
data.TimeUpper = (uint32_t) (t2 >> 16);