2013-03-17 73 views
2

我可能會錯過對Java中字節的一些基本理解。以下是應用程序的一個簡化摘錄來說明問題:Java字節變量如何成爲128?

public class Foo 
{ 
byte b1; 
byte b2; 
byte bProblem; 
} 

foo是Foo的一個實例。下面已經困擾了我好幾個小時:

Log.d("Debug", "Before: " + String.valueOf(foo.bProblem)); 
if (foo.bProblem != (byte) 0x80) { 
    foo.bProblem = (byte) 0x80; 
    Log.d("Debug", "After: " + String.valueOf(foo.bProblem)); 
} 

logcat中顯示以下內容:

03-17 21:58:46.590: D/Debug(2130): Before: 128  
03-17 21:58:46.590: D/Debug(2130): After: -128 

Eclipse的調試器總是顯示-128(0x80的)爲foo.bProblem。這意味着調試器無法看到String.valueOf()顯示的內容。 Java字節如何可以是128?

我在將foo.bProblem添加到List時發現了這個問題: Java.lang.ArrayIndexOutOfBoundsException:length = 256; index = 256

任何人都可以提供一些提示讓我明白這一點嗎?

編輯:

我後來發現這種情況只在Intel Android模擬器正如我在我的評論如下喬普的回答中寫道。

+0

'byte'不能容納'128'! 'byte'的值應該在'-128'和'127'之間。 – 2013-03-17 22:27:55

+0

這是我的理解。 String.valueOf(foo.bProblem)如何產生128? – Hong 2013-03-17 22:30:16

+0

我能想到產生'128'的唯一方法是在'foo.bProblem'前加一個減號作爲'String.value( - foo.bProblem)',其中'foo.bProblem ==(byte) 0x80'。 – 2013-03-17 22:37:16

回答

4

將String.valueOf不採取字節,它需要執行下列操作之一:

布爾 焦炭 的char [] 雙 浮動 INT 長 對象

在你實現你實際上是調用String.valueOf(int value) 它實際上並不包含128的值。試試打印

Log.d("Debug", "" + bProblem) 

這應該工作。

EDIT--

我想說的是,將String.valueOf實際上並不看字節的值。它正在查看構成字節的相同位,並將其打印出來。

+0

我將代碼更改爲Log.d(「Debug」,「Before:」+ foo.bProblem),並得到了相同的結果。 – Hong 2013-03-17 22:38:25

4

在java虛擬機中,字節字段bProblem將使用int。現在,使用String.valueOf(int),因爲沒有字節變體。所以(誤?)場取爲整型,所以無符號,128


對不起,我試圖達到128,但沒有成功(Java 7中,Linux的)

我已經成爲偏執狂,你使用了一個int類型的bProblem的子類。或者更可能是一個正在使用的Java源代碼不是最新編譯的編譯類。也許你可以嘗試另一種編譯器而不是eclipse。

+0

但是'byte b =(byte)0x80; System.out.println(String.valueOf(b));'打印'-128'? – 2013-03-17 22:40:45

+0

什麼值的字節變量會導致String.valueOf(foo.bProblem)=「128」? String.valueOf()僅用於顯示問題。我真正的問題是,foo.bProblem無法添加到列表。確切地說, – Hong 2013-03-17 22:42:38

+0

。當給128個字節賦予任何一個字節時,轉換爲-128就是暗含的。否則會使整個語言不一致。說實話,我不能重現這一點。 – user1050755 2013-03-17 22:45:35

相關問題