2017-01-27 191 views
-2

我需要用C語言實現一個使用64位變量的操作。儘管如此,嵌入式系統只允許不超過32位的操作。 例如,也許我需要將64位變量拆分爲32位,然後應用操作並將值返回64位。32位系統中的32位和64位之間的操作(sint/uint)

請檢查下面的僞代碼:

功能添加()

 sint64 or uint64 A 
     sint32 or uint32 B 
     sint64 Result 

     Result = A + B 
     return Result 

觀測值。 :「添加」不受溢出保護。

你願意幫我解決這個問題嗎?

+0

'div()'不會像那樣工作。這是計算機算法中最複雜的功能。 – 0andriy

+0

真的嗎? 你的意思是不會使用我所說的Add()方法嗎? –

+0

它不會。如果您嘗試在32位平臺上將64位值除以32或64位值,則不會那麼簡單。 – 0andriy

回答

-1

我發現使用聯盟結構的答案都是不禮貌的,但正確的。已經完成了。

預先感謝您!

+0

這不是一個答案。 – linuxfan

0

快速嘗試。 有兩個32比特的無符號整數:AHIALO(分裂64 UINT)

uint32 ahi, alo; 
void add_to_a(uint32 b) { 
    if (b==0) return; // adding 0 to a number does not change it 
    alo = alo+b;  // alo should not be less than b now, so... 
    if (alo<b) ahi++; // check for carry (overflow) 
    // if carry, increment ahi 
} 

唯一棘手的部分,上方,是檢查是否有同時加入下部的進位。 CPU有一個內部機制來做到這一點,但在這裏我訴諸另一個想法。還要注意測試「if(b == 0)return」是相當多餘的,但它可以很方便。

一般來說,您可以設計其他運算符( - ,*,/),思考我們都學到了什麼。如果你知道如何手工操作,你可以用C語言翻譯,認爲我們打破數字的長數字。我們的思想使用的是從0到9的數字,C程序可以使用8位或16位或32的數字。上面的代碼片段是手動方法的直接轉換以添加兩個數字:我們從最後幾位開始到將它們總結起來,看看這個總和是否在一個數字中。如果是的話,我們記下這個數字,然後傳給下一個數字。否則,我們寫下餘數(「什麼適合數字」)並使用進位。上面的代碼片段甚至更簡單,因爲我們知道這兩個數字分別由2位數和1位組成。

可以使分區相同(複製「手動」方法),但必須使用一些位移位。或者,如果您不介意浪費時間,只需計算您可以從另一個數字中減去一個數字的次數。 :-)

相關問題