2017-03-02 48 views
-1

我一直在學習一些關於二進制和記憶,我看着如何INT被寫入,從我的理解是基本寫入4個字節,其中已簽署的最大數量是你的4個字節是127從4個字節構建一個有符號的整數?

byte a = Byte.MAX_VALUE; 
    byte b = Byte.MAX_VALUE; 
    byte c = Byte.MAX_VALUE; 
    byte d = Byte.MAX_VALUE; 

    System.out.println((a << 24) + (b << 16) + (c << 8) + (d << 0)); 

然後我每次左移一個字節(8位))。

但我得到的最大數量是2139062143而不是2147483647,這是爲什麼?

+1

因此,生產Integer.MAX_VALUE? – shmosel

+0

您正在打印0x7f7f7f7f。 – VGR

+0

INT_MAX是2147483647和-2147483648因爲0需要一個點 – CSK

回答

1

在二進制,MAX_VALUE S代表每種類型的啓動與一0位並繼續所有的1位。這意味着,要獲得Integer.MAX_VALUE,你需要一個0位後跟隨31 1位:

Integer.MAX_VALUE: 01111111111111111111111111111111 

但是,你不生產這一點。您重複使用Byte.MAX_VALUE四次。這意味着你有一個0位後7 1位,然後是一個0位後7 1位等:

Byte.MAX_VALUE:  01111111 
Byte.MAX_VALUE×4:  01111111011111110111111101111111 (2,139,062,143) 

由於-1 s的單獨的1位組成,你可以得到你想要什麼一個Byte.MAX_VALUE跟着三個-1 S:

Byte.MAX_VALUE:  01111111 
-1:     11111111 
Byte.MAX_VALUE, -1×3: 01111111111111111111111111111111 

當您嘗試COMBIN會出現第二個問題這些。當Java將負數byte轉換爲int時,它將成爲負數int,這意味着大量的1將以二進制形式添加到其左側。因此,您需要使用& 0xff(或Byte.toUnsignedInt)從每個byte中去除這些添加的位。

最好使用|而不是+,因爲它更符合更精確的內容。你爲什麼要使用'+'

byte a = Byte.MAX_VALUE; 
byte b = -1; 
byte c = -1; 
byte d = -1; 

System.out.println(((a & 0xff) << 24) | ((b & 0xff) << 16) | ((c & 0xff) << 8) | ((d & 0xff) << 0)); 
+0

明白了。 -1&0xff給了我255,我需要127,255,255,255爲了創建01111111111111111111111111111111,如果有符號數是負數或正數,第一位表示如果它是1,它將是負的。我對嗎? – Jony

+0

但是如果我想要做到負面呢? – Jony

+0

是的。哪個負值? –

0

不,最高有效位必須爲零,所有其他位都必須爲1.這會給出0x7FFFFFFF,即2's complement中有符號的32位整數的最大值。

0

byte在-128和127之間被標記。所以-1是8。

由於轉移<<在將byte提升爲int之後完成,您將得到32個int -1。

所以做

int a = 0xFF; // Or 0b1111_1111 
int b = 0xFF; 
int c = 0xFF; 
int d = 0xFF; 

或做:

byte[] bytes = { (byte)-1, (byte)-1, (byte)-1, (byte)-1 }; 
int n = ByteBuffer.wrap(bytes).getInt(); 

所有的人一個可以作爲獲取:

int n = -1; 
int n = ~0; // Ones complement 
+0

http://stackoverflow.com/questions/2840190/java-convert-4-bytes-to-int但我完全喜歡這個答案,除了OR和AND運營商,這是我誤解的東西?不應該使用值爲127的4個字節爲您提供有符號整數最大值,即2147483647 – Jony

+0

127爲二進制0111_111,Byte.MAX_VALUE。所以不行。您可以將一個字節(通過移位操作擴展爲int)作爲:'(b&0xFF)<< ...'。 –

相關問題