[英]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.