2016-07-12 81 views
0

我想存入兩個16位register.For例如無符號長值,如果我有長期價值(-2,147,483,648 to 2,147,483,647)然後我用公式,如:存放無符號長值寄存器

v[0] = myValue % 65536 
v[1] = myValue/65536 

要獲得價值註冊

outVal = reg0 + (reg1 * 65536) 

但如何爲無符號長,其取值範圍在0 to 4,294,967,295?

+0

你知道這個公式的作用嗎?因爲它對我來說看起來很可怕。它應該與未簽名的操作一起工作,但簽名..我不知道,這只是讓我感到非常不舒服 – harold

+0

當將最初的負值加回時,它會在高16位中給出不正確的結果,除非您正在存儲假定的有符號的32位變量中的16位值,是(這與此目的相違背)。當然,如果'/'運算符是浮點除法,後面四捨五入到最接近的整數,而不是整數除法,那麼它根本不起作用。 – CherryDT

+1

您顯示的值是「int」的最小/最大值。你想把它存儲在2x16位= 32位= int的大小。但是你問如何存儲一個** long **,這是64位?那麼你想要存儲什麼? – Arjan

回答

3

正如批評家哈羅德指出已經在做,你的公式不甚至可以正確處理負數。

你應該按位而不是使用數學來避免意外(並且在編譯器沒有爲你優化它的情況下加快速度)。

分裂:

v[0] = myValue & 0xFFFF 
v[1] = myValue >> 16 // this implicitly cuts off the lower 16 bits 
         // by shifting them away into the nirvana 

加入:

outVal = reg0 | (reg1 << 16) 

現在,這適用於符號和無符號(前提是所有的變量具有相同的 「標誌型」)。


傳說,如果你的語言(你沒有指定)使用不同的運營商:

&是按位,|是按位OR,<<>>是按位左移/右(SHL/SHR),0x表示十六進制文字(您可以使用65536而不是0xFFFF,但我認爲十六進制文字可以更清楚地表示這個幻數來自哪裏)。

+0

我正在用Java編寫代碼 – Josef

+1

然後我的示例應該按原樣工作。另見https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html – CherryDT