2011-04-08 59 views
0

我發現無符號整數在Java中很直。如果我想介紹0xFXXX XXXX,Java需要我聲明一個長變量來存儲0xFXXX XXXX,並使用4294967295(0xFFFFFFFFL)執行按位與操作。 任何人都可以將您對未簽名問題的體驗分享給他人或我?有趣的未簽名在java中

+2

Java沒有無符號類型,你需要考慮那些自己。如果你假設沒有簽名,那麼,好吧,不要。作爲幫手,Google確實爲其公有領域Guava庫(http://code.google.com/p/guava-libraries/)中的位操作提供了便捷方法,並檢查了SignedBytes和UnsignedBytes。 – Esko 2011-04-08 16:50:42

+0

這太有趣了 - 可能javac確實允許int unsigned = 0xfeefabba;它不需要聲明一個長變量。 – Ingo 2011-04-08 17:20:37

+1

感謝您共享的Esko,番石榴圖書館真棒〜 – Peica 2011-04-08 17:32:27

回答

0

可能要檢查了這一點:http://www.javamex.com/java_equivalents/unsigned.shtml

C++:

unsigned byte b = ...; 
b += 100; 

unsigned int v = ...; 
v *= 2; 

相當於Java:

int b = ...; 
b = (b + 100) & 0xff; 

long v = ...; 
v = (v * 2) & 0xffffffffL; 

當你使用無符號值,將它轉換爲類型你想,它會自然地包裹,給你正確的值:

// Example: write an unsigned int (stored in a long) 
// to a byte buffer. 
ByteBuffer bb = ... 
long unsignedInt = ... 
bb.putInt((int) unsignedInt); 
+0

這段代碼在這些語句中有問題, long v = ...; v =(v * 2)&0xffffffff; 'v'應該總是等於-1。我們必須使用'&0xffffffffL'。 – Peica 2011-04-08 17:38:21

+0

更正:) :) – 2011-04-08 18:52:18

+0

非常感謝 – Peica 2011-04-08 19:04:41

0

在java中int egers是32位長;然而,第一點是爲了標誌。實際上,整數只有31位長。

您的號碼是正數32位長數字;因此,它不能適應埃格爾,因此需要一個long

編輯:爲什麼downvote?!

整數表示爲2的補,對於簡單的8位字:

 
MSB 
0 1 1 1 1 1 1 1 = 127 
0 1 1 1 1 1 1 0 = 126 
0 0 0 0 0 0 1 0 = 2 
0 0 0 0 0 0 0 1 = 1 
0 0 0 0 0 0 0 0 = 0 
1 1 1 1 1 1 1 1 = −1 
1 1 1 1 1 1 1 0 = −2 
1 0 0 0 0 0 0 1 = −127 
1 0 0 0 0 0 0 0 = −128 

MSB,第一位有效的指示標誌

編輯2:我累了討論一個爭論點。 downvoting之前,請參閱this

+0

這並非如此。您可以在32位有符號整型中保存32位無符號整數。無論是否簽名,只與某些操作(關注點出現)和輸出有關。然而,除此之外,無論如何,都是一樣的。這是2s補碼的好處。 – Ingo 2011-04-08 16:57:29

+0

它在很多操作中都很重要。只有直到你將int加入long爲止,加法纔會起作用。 – 2011-04-08 17:02:24

+1

@Ingo:運行這段代碼:'{int x = 2147483647; \t System.out.println(x + 1); X ++;的System.out.println(X); }' – CMR 2011-04-08 17:02:37