我想存入兩個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?
我想存入兩個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?
正如批評家哈羅德指出已經在做,你的公式不甚至可以正確處理負數。
你應該按位而不是使用數學來避免意外(並且在編譯器沒有爲你優化它的情況下加快速度)。
分裂:
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
,但我認爲十六進制文字可以更清楚地表示這個幻數來自哪裏)。
你知道這個公式的作用嗎?因爲它對我來說看起來很可怕。它應該與未簽名的操作一起工作,但簽名..我不知道,這只是讓我感到非常不舒服 – harold
當將最初的負值加回時,它會在高16位中給出不正確的結果,除非您正在存儲假定的有符號的32位變量中的16位值,是(這與此目的相違背)。當然,如果'/'運算符是浮點除法,後面四捨五入到最接近的整數,而不是整數除法,那麼它根本不起作用。 – CherryDT
您顯示的值是「int」的最小/最大值。你想把它存儲在2x16位= 32位= int的大小。但是你問如何存儲一個** long **,這是64位?那麼你想要存儲什麼? – Arjan