2014-02-11 114 views
6

1)爲什麼以下分配不允許:瞭解Java數據類型

byte b = 0b11111111; // 8 bits or 1 byte 

但這種分配是可以的:

int i = 0b11111111111111111111111111111111; //32 bits or 4 bytes 

這兩種類型的簽名,我希望bi是-1。

2)爲什麼整數MIN_VALUE沒有符號?

public static final int MIN_VALUE = 0x80000000; 

但是字節MIN_VALUE確實有符號?

public static final byte MIN_VALUE = -128; 
+3

這個問題似乎是題外話題,因爲它是關於無心學生的家庭作業分配。 – duffymo

+0

你看過:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html ....你知道嗎...解釋所有這些的文檔? –

+4

其實,@NathanielWaggoner,那個特定的文檔並沒有解釋這些問題。 –

回答

4

所有整數文字都有int(除非加上後綴Ll)。因此,在第一種情況下,您將int存儲爲byte。像這樣的縮小轉換是不允許的,除非如果右側是常量,如果該值在範圍內,則允許該轉換,即-1281270b11111111爲255,但不在範圍內。

至於爲什麼int i = 0b11111111111111111111111111111111被允許:這幾乎是「因爲JLS這麼說」。實際上,該具體示例出現在JLS 3.10.1中。有一條規則,十進制int類型的文字不能超過214743647(除特殊情況下爲-2147483648),但除了必須適合32位外,沒有關於二進制文字的規則。

正如我在評論中提到的那樣,第二個問題實際上是關於編寫代碼的程序員的樣式偏好的問題,並且無法回答。

+0

@divanov我需要檢查一下,因爲我認爲我已經聽說過在兩個方向使用的動詞「assign」,但我已經修復它以避免單詞完全。 – ajb

+0

顯然我「固定」它很糟糕。感謝編輯。 – ajb

6

問題1)

這是因爲0b11111111int文字,其值是255。該值不適合一個字節。有關詳細信息,請參閱http://docs.oracle.com/javase/7/docs/technotes/guides/language/binary-literals.html

問題2)

當我們寫二進制或十六進制的文字中,我們從來沒有把一個標誌。字面0x80000000實際上是一個負值,即使我們沒有這樣寫。

爲什麼JDK的製造商選擇使用-128的十進制文字而不是0x80000000的十六進制文字;除了在每種情況下,這可能是一個更清晰的方式。