問題描述
為什么會這樣:
char p = 0;
p--;
System.out.println(p);
結(jié)果65535
為什么不給它一個編譯錯誤或運行時異常?我期望它,因為字符不能為負數(shù).相反,它從倒掛開始倒數(shù).提前致謝.
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?
因為語言規(guī)范要求原始類型的算術(shù)是模 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
.
在 整數(shù)運算部分,據(jù)說
內(nèi)置的整數(shù)運算符不會以任何方式指示上溢或下溢.
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 和變量的值執(zhí)行二進制數(shù)字提升(第 5.6.2 節(jié)).如有必要,通過縮小原始轉(zhuǎn)換(第 5.1.3 節(jié))和/或在存儲變量之前對其類型進行裝箱轉(zhuǎn)換(第 5.1.7 節(jié))來縮小差異.后綴遞減表達式的值是變量在新值被存儲之前的值.
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.
二進制數(shù)字提升將值和 1 都轉(zhuǎn)換為 int
(因為這里的類型是 char
),因此您有中間結(jié)果 -1
為int
,則進行窄化原語轉(zhuǎn)換:
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:
有符號整數(shù)到整數(shù)類型 T 的窄化轉(zhuǎn)換只會丟棄除 n 個最低位之外的所有位,其中 n 是用于表示類型 T 的位數(shù).除了可能丟失有關(guān)數(shù)值,這可能會導(dǎo)致結(jié)果值的符號與輸入值的符號不同.
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.
導(dǎo)致 0xFFFF
的 char
值(因為 Java 為其有符號整數(shù)類型指定二進制補碼表示,在 一元減號):
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):
對于整數(shù)值,取反與從零減法相同.Java 編程語言對整數(shù)使用二進制補碼表示,二進制補碼值的范圍不是對稱的,因此最大負 int 或 long 的取反會產(chǎn)生相同的最大負數(shù).這種情況下會發(fā)生溢出,但不會拋出異常.對于所有整數(shù)值 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.
對于超出范圍結(jié)果的一般環(huán)繞行為,例如 在乘法運算符的規(guī)范中:
For the general wrap-around behaviour for out-of-range results, as an example in the specification of the multiplication operator:
如果整數(shù)乘法溢出,則結(jié)果是數(shù)學(xué)乘積的低位,以某種足夠大的二進制補碼格式表示.因此,如果發(fā)生溢出,則結(jié)果的符號可能與兩個操作數(shù)的數(shù)學(xué)乘積的符號不同.
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.
在整數(shù)加法的規(guī)范中出現(xiàn)類似的短語,需要減法來滿足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.
這篇關(guān)于負字符值 JAVA的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網(wǎng)!