問(wèn)題描述
為什么會(huì)這樣:
char p = 0;
p--;
System.out.println(p);
結(jié)果65535
為什么不給它一個(gè)編譯錯(cuò)誤或運(yùn)行時(shí)異常?我期望它,因?yàn)樽址荒転樨?fù)數(shù).相反,它從倒掛開(kāi)始倒數(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.
推薦答案
為什么不給它一個(gè)編譯錯(cuò)誤或運(yùn)行時(shí)異常?
Why does not give it out a compilation error or a runtime Exception?
因?yàn)檎Z(yǔ)言規(guī)范要求原始類型的算術(shù)是模 2^width
,所以 -1
變成 2^16-1
為一個(gè) 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ù)運(yùn)算部分,據(jù)說(shuō)
內(nèi)置的整數(shù)運(yùn)算符不會(huì)以任何方式指示上溢或下溢.
The built-in integer operators do not indicate overflow or underflow in any way.
這樣就禁止拋出異常.
對(duì)于使用的后綴減量運(yùn)算符,具體而言,其行為在 15.14.3
For the postfix-decrement operator used, specifically, its behaviour is specified in 15.14.3
否則,從變量的值中減去值 1,并將差值存儲(chǔ)回變量中.在減法之前,對(duì)值 1 和變量的值執(zhí)行二進(jìn)制數(shù)字提升(第 5.6.2 節(jié)).如有必要,通過(guò)縮小原始轉(zhuǎn)換(第 5.1.3 節(jié))和/或在存儲(chǔ)變量之前對(duì)其類型進(jìn)行裝箱轉(zhuǎn)換(第 5.1.7 節(jié))來(lái)縮小差異.后綴遞減表達(dá)式的值是變量在新值被存儲(chǔ)之前的值.
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.
二進(jìn)制數(shù)字提升將值和 1 都轉(zhuǎn)換為 int
(因?yàn)檫@里的類型是 char
),因此您有中間結(jié)果 -1
為int
,則進(jìn)行窄化原語(yǔ)轉(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:
有符號(hào)整數(shù)到整數(shù)類型 T 的窄化轉(zhuǎn)換只會(huì)丟棄除 n 個(gè)最低位之外的所有位,其中 n 是用于表示類型 T 的位數(shù).除了可能丟失有關(guān)數(shù)值,這可能會(huì)導(dǎo)致結(jié)果值的符號(hào)與輸入值的符號(hào)不同.
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
值(因?yàn)?Java 為其有符號(hào)整數(shù)類型指定二進(jìn)制補(bǔ)碼表示,在 一元減號(hào)):
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):
對(duì)于整數(shù)值,取反與從零減法相同.Java 編程語(yǔ)言對(duì)整數(shù)使用二進(jìn)制補(bǔ)碼表示,二進(jìn)制補(bǔ)碼值的范圍不是對(duì)稱的,因此最大負(fù) int 或 long 的取反會(huì)產(chǎn)生相同的最大負(fù)數(shù).這種情況下會(huì)發(fā)生溢出,但不會(huì)拋出異常.對(duì)于所有整數(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.
對(duì)于超出范圍結(jié)果的一般環(huán)繞行為,例如 在乘法運(yù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é)乘積的低位,以某種足夠大的二進(jìn)制補(bǔ)碼格式表示.因此,如果發(fā)生溢出,則結(jié)果的符號(hào)可能與兩個(gè)操作數(shù)的數(shù)學(xué)乘積的符號(hào)不同.
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)類似的短語(yǔ),需要減法來(lái)滿足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)于負(fù)字符值 JAVA的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,也希望大家多多支持html5模板網(wǎng)!