問題描述
為什么會這樣:
char p = 0;
p--;
System.out.println(p);
結果65535
為什么不給它一個編譯錯誤或運行時異常?我期望它,因為字符不能為負數.相反,它從倒掛開始倒數.提前致謝.
Why does not give it out a compilation error or a runtime Exception? I expected it as chars cannot be negative. Instead it starts back counting from upside down. Thanks in advance.
推薦答案
為什么不給它一個編譯錯誤或運行時異常?
Why does not give it out a compilation error or a runtime Exception?
因為語言規范要求原始類型的算術是模 2^width
,所以 -1
變成 2^16-1
為一個 char
.
Because the language specification mandates that arithmetic on primitive types is modulo 2^width
, so -1
becomes 2^16-1
as a char
.
在 整數運算部分,據說
內置的整數運算符不會以任何方式指示上溢或下溢.
The built-in integer operators do not indicate overflow or underflow in any way.
這樣就禁止拋出異常.
對于使用的后綴減量運算符,具體而言,其行為在 15.14.3
For the postfix-decrement operator used, specifically, its behaviour is specified in 15.14.3
否則,從變量的值中減去值 1,并將差值存儲回變量中.在減法之前,對值 1 和變量的值執行二進制數字提升(第 5.6.2 節).如有必要,通過縮小原始轉換(第 5.1.3 節)和/或在存儲變量之前對其類型進行裝箱轉換(第 5.1.7 節)來縮小差異.后綴遞減表達式的值是變量在新值被存儲之前的值.
Otherwise, the value 1 is subtracted from the value of the variable and the difference is stored back into the variable. Before the subtraction, binary numeric promotion (§5.6.2) is performed on the value 1 and the value of the variable. If necessary, the difference is narrowed by a narrowing primitive conversion (§5.1.3) and/or subjected to boxing conversion (§5.1.7) to the type of the variable before it is stored. The value of the postfix decrement expression is the value of the variable before the new value is stored.
二進制數字提升將值和 1 都轉換為 int
(因為這里的類型是 char
),因此您有中間結果 -1
為int
,則進行窄化原語轉換:
The binary numeric promotion converts both, the value and 1, to int
(since the type here is char
), thus you have the intermediate result -1
as an int
, then the narrowing primitive conversion is performed:
有符號整數到整數類型 T 的窄化轉換只會丟棄除 n 個最低位之外的所有位,其中 n 是用于表示類型 T 的位數.除了可能丟失有關數值,這可能會導致結果值的符號與輸入值的符號不同.
A narrowing conversion of a signed integer to an integral type T simply discards all but the n lowest order bits, where n is the number of bits used to represent type T. In addition to a possible loss of information about the magnitude of the numeric value, this may cause the sign of the resulting value to differ from the sign of the input value.
導致 0xFFFF
的 char
值(因為 Java 為其有符號整數類型指定二進制補碼表示,在 一元減號):
resulting in a char
value of 0xFFFF
(since Java specifies two's complement representation for its signed integer types, explicitly stated in the specification of unary minus):
對于整數值,取反與從零減法相同.Java 編程語言對整數使用二進制補碼表示,二進制補碼值的范圍不是對稱的,因此最大負 int 或 long 的取反會產生相同的最大負數.這種情況下會發生溢出,但不會拋出異常.對于所有整數值 x,-x 等于 (~x)+1.
For integer values, negation is the same as subtraction from zero. The Java programming language uses two's-complement representation for integers, and the range of two's-complement values is not symmetric, so negation of the maximum negative int or long results in that same maximum negative number. Overflow occurs in this case, but no exception is thrown. For all integer values x, -x equals (~x)+1.
對于超出范圍結果的一般環繞行為,例如 在乘法運算符的規范中:
For the general wrap-around behaviour for out-of-range results, as an example in the specification of the multiplication operator:
如果整數乘法溢出,則結果是數學乘積的低位,以某種足夠大的二進制補碼格式表示.因此,如果發生溢出,則結果的符號可能與兩個操作數的數學乘積的符號不同.
If an integer multiplication overflows, then the result is the low-order bits of the mathematical product as represented in some sufficiently large two's-complement format. As a result, if overflow occurs, then the sign of the result may not be the same as the sign of the mathematical product of the two operand values.
在整數加法的規范中出現類似的短語,需要減法來滿足a - b == a + (-b)
,所以溢出行為如下.
Similar phrases occur in the specification of integer addition, and subtraction is required to fulfill a - b == a + (-b)
, so the overflow behaviour follows.
這篇關于負字符值 JAVA的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!