2011-11-17 46 views
2
我有一般

轉換和從字節在java中

byte b = (byte)170; 
System.out.println("Byte to int" + (int)b); 

很難理解轉換和從字節或字節那爲什麼當我投170字節再投那個字節,一個int

我得到-86,做這件事的正確方法是什麼?

編輯:好了,回答我的問題非常簡單(byte範圍從-128到127)...... 我在那裏越來越困惑的是,我真正想要的是二進制10101010是在字節,所以我想通在int中表示該數字並將其放在字節中。有人可以告訴我如何將二進制數字轉換爲字節嗎?

+0

你可能想要做'0xFF的&(INT)B' –

回答

3

值170的二進制表示爲一個32位的整數是

0000 0000 0000 0000 0000 0000 1010 1010 

當你施放的是一個byte,它成爲1010 1010。由於Java中的所有整數都是有符號的,因此它將1010 1010看作是一個2's complement 8位整數。那是-86。

當您將這個字節回用(int) b整數,它得到signed extended到:

1111 1111 1111 1111 1111 1111 1010 1010 

這也是-86。你想對它應用一個位掩碼,所以它又變成了170。

(int) (0xff & b)會給你170回:

1111 1111 1111 1111 1111 1111 1010 1010 
0000 0000 0000 0000 0000 0000 1111 1111 & (bitwise and) 
--------------------------------------- 
0000 0000 0000 0000 0000 0000 1010 1010 
+1

謝謝你這個非常透徹的解釋。我明白,但只是想檢查一件事。這是在單個字節中表示10101010的最佳方式嗎?換句話說,在沒有使用位掩碼的情況下,沒有辦法在java中表示它? –

+1

@KevinMoore位掩碼讓**你**看到該字節爲無符號的8位整數而不是有符號的8位整數。就機器而言,b是'10101010'。數據('10101010')與解釋方式有所不同(如果將其看作是有符號整數,則爲-86,如果將其看作無符號整數,則爲170) – Aillyn

+0

有史以來最全面的解釋! – Willmore

0

你不能存儲170到一個字節。字節大小是從-128到127

+0

是的,你可以 - 讓未簽名。 – NullUserException

+0

通過將它分配給一個簡短的? – Mechkov

+0

無符號的8位int可以具有從0到255的範圍。問題是,在Java中沒有無符號類型。 – NullUserException

1

問題是,字節爲8位的數據類型和它的範圍是從-128到127因此,有沒有「losless轉換」 ...

+0

無符號的8位int可以具有從0到255的範圍。 – NullUserException

+1

這與Java無關,因爲不支持無符號類型。 – MOleYArd

+0

是的,沒有內置的支持。這並不意味着你無法解決這個問題。假設它是一個無符號的8位整數,你可以有一個方法將字節轉換爲「int」(或「short」)。以相反的方式做同樣的事情。現在,您對未簽名的8位整數有支持(有點冒險)。 – NullUserException

1

byte原始類型的最小值爲-128,最大值爲127(包括)。

您試圖通過顯式轉換指定超出範圍byte的170(int),這會導致丟失有關數值整體大小的信息。

在這裏看到:Primitive Data Types

還要檢查這個JLS節:5.1.3 Narrowing Primitive Conversions

1

那的事業字節在Java簽署,所以你基本上四溢灣

1

要轉換整數成字節:

int original = 170; 
byte b = (byte)(0xFF & original); 

這將使10101010進入byteNum通過「切斷」的第一個字節之外的任何內容。如果你打印這個數字,你會得到一個-86。到轉換回做到這一點:

int num = (int)b & 0xFF; 

此字節轉換成整數,然後掩模關閉簽名比特,恢復的170