簡體   English   中英

負字符值 JAVA

[英]negative char Value JAVA

為什么會發生以下情況:

char p = 0;
p--;
System.out.println(p);

結果65535

為什么不給出編譯錯誤或運行時異常? 我預計它是因為字符不能為負。 相反,它從倒過來開始倒數。 提前致謝。

為什么不給出編譯錯誤或運行時異常?

因為語言規范要求原始類型的算術是模2^width ,所以-1變成2^16-1作為char

整數運算部分中,指出

內置整數運算符不以任何方式指示上溢或下溢。

所以禁止拋出異常。

對於所使用的后綴遞減運算符,具體而言,其行為在15.14.3 中指定

否則,從變量的值中減去值 1,並將差值存儲回變量中。 在減法之前,對值 1 和變量的值執行二進制數字提升(第 5.6.2 節)。 如有必要,在存儲變量之前,通過縮小原始轉換(第 5.1.3 節)和/或進行裝箱轉換(第 5.1.7 節)來縮小差異。 后綴遞減表達式的值是存儲新值之前變量的值。

二進制數字提升將 value 和 1 都轉換為int (因為這里的類型是char ),因此您將中間結果-1作為int ,然后執行縮小原語轉換:

有符號整數到整數類型 T 的縮窄轉換只會丟棄除 n 個最低位以外的所有位,其中 n 是用於表示類型 T 的位數。此外可能會丟失有關數值大小的信息,這可能會導致結果值的符號與輸入值的符號不同。

導致char值為0xFFFF (因為 Java 為其有符號整數類型指定了二進制補碼表示,在一元減號的規范中明確說明):

對於整數值,否定與從零減法相同。 Java 編程語言對 integers 使用二進制補碼表示,並且二進制補碼值的范圍不對稱,因此最大負 int 或 long 的否定會導致相同的最大負數。 在這種情況下會發生溢出,但不會拋出異常。 對於所有整數值 x,-x 等於 (~x)+1。

對於超出范圍結果的一般環繞行為,作為乘法運算符規范中的示例:

如果整數乘法溢出,則結果是數學乘積的低位,以某種足夠大的二進制補碼格式表示。 因此,如果發生溢出,則結果的符號可能與兩個操作數值的數學乘積的符號不同。

類似的短語出現在整數加法的規范中,需要減法來滿足a - b == a + (-b) ,因此溢出行為如下。

因為這就是 Java 語言的定義方式。 運行時不會檢查每個操作的邊界(可能是因為它會非常昂貴)。 它只是溢出或下溢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM