1 回答

TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊
首先,賦值轉(zhuǎn)換,JLS 5.2涵蓋了可以賦值的值。
此外,如果表達(dá)式是
byte
、short
、char
或 類型的常量表達(dá)式 (§15.28)?int
:
如果變量的類型為 、 或 ,并且常量表達(dá)式的值可以用變量的類型表示,則可以使用縮小基
byte
元short
轉(zhuǎn)換char
。
對(duì)于byte a = 0;
常量表達(dá)式 是 ,int
?0
它被縮小為 a?byte
。
接下來,調(diào)用上下文,JLS 5.3介紹了可以將哪些值傳遞給方法。
嚴(yán)格或松散的調(diào)用上下文都不包括賦值上下文中允許的整數(shù)常量表達(dá)式的隱式縮小。
因此,您的代碼對(duì)于調(diào)用上下文(方法調(diào)用)中不允許的常量表達(dá)式縮小轉(zhuǎn)換存在編譯器錯(cuò)誤。
setByte(0);?//?no?implicit?narrowing?conversion,?even?if?it's?a?constant?expression void?setByte(byte?b){}
您的代碼128 - 1
是一個(gè)縮小為byte
.
但是,2147483648 - 1
由于2147483648
它本身不是有效的int
文字,因此被禁止,第 3.10.1 節(jié)“整數(shù)文字”。
如果十進(jìn)制文字 2147483648 出現(xiàn)在除一元減運(yùn)算符的操作數(shù)之外的任何位置,則會(huì)出現(xiàn)編譯時(shí)錯(cuò)誤;或者如果 int 類型的十進(jìn)制文字大于 2147483648 (2?31?)。
如果您確實(shí)想使用不必要的復(fù)雜表達(dá)式來初始化int
,您可以使用long
文字使表達(dá)式合法:
2147483648L?-?1
但隨后您必須將表達(dá)式顯式轉(zhuǎn)換為int
;?不存在從任何比 更寬的int
內(nèi)容到 的隱式縮小int
:
(int)?(2147483648L?-?1)
奇怪的是,您不必在表達(dá)式周圍放置括號(hào),以便強(qiáng)制轉(zhuǎn)換適用于整個(gè)表達(dá)式,盡管為了清楚起見,我強(qiáng)烈建議使用括號(hào)。
(int)?2147483648L?-?1??//?It's?2147483647!
對(duì)超出范圍的文字int
進(jìn)行強(qiáng)制轉(zhuǎn)換將產(chǎn)生 -2147483648,一個(gè)有效值。這里減 1 涉及負(fù)方向溢出,產(chǎn)生預(yù)期值 2147483647。long
int
int
添加回答
舉報(bào)