亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么我們不能將整數文字作為參數傳遞給以字節作為形式參數的方法

為什么我們不能將整數文字作為參數傳遞給以字節作為形式參數的方法

翻閱古今 2023-07-19 16:42:51
查詢1:byte a = 0; // int to byte implicit conversion happens, correct!, no CTE [compile time error]setByte(0); // CTE!, why ? implicit conversion do not happen here void setByte(byte b){}查詢2:byte b_byte = 128 - 1; // integer literal computation results to 127 int which implicitly casts to byte and as 127 is in range of byte so no CTE, Correct!int a_int = 2147483647; // in range of int, so no CTEint b_int = 2147483648 - 1; // still in range of int but CTE, why ?請解釋一下,并指出定義這些規則的 JLS 部分。
查看完整描述

1 回答

?
ABOUTYOU

TA貢獻1812條經驗 獲得超5個贊

首先,賦值轉換,JLS 5.2涵蓋了可以賦值的值。

此外,如果表達式是byte、shortchar或 類型的常量表達式 (§15.28)?int

  • 如果變量的類型為 、 或 ,并且常量表達式的值可以用變量的類型表示,則可以使用縮小基byteshort轉換char

對于byte a = 0;常量表達式 是 ,int?0它被縮小為 a?byte。

接下來,調用上下文,JLS 5.3介紹了可以將哪些值傳遞給方法。

嚴格或松散的調用上下文都不包括賦值上下文中允許的整數常量表達式的隱式縮小。

因此,您的代碼對于調用上下文(方法調用)中不允許的常量表達式縮小轉換存在編譯器錯誤。

setByte(0);?//?no?implicit?narrowing?conversion,?even?if?it's?a?constant?expression
void?setByte(byte?b){}

您的代碼128 - 1是一個縮小為byte.

但是,2147483648 - 1由于2147483648它本身不是有效的int文字,因此被禁止,第 3.10.1 節“整數文字”。

如果十進制文字 2147483648 出現在除一元減運算符的操作數之外的任何位置,則會出現編譯時錯誤;或者如果 int 類型的十進制文字大于 2147483648 (2?31?)。

如果您確實想使用不必要的復雜表達式來初始化int,您可以使用long文字使表達式合法:

2147483648L?-?1

但隨后您必須將表達式顯式轉換為int;?不存在從任何比 更寬的int內容到 的隱式縮小int

(int)?(2147483648L?-?1)

奇怪的是,您不必在表達式周圍放置括號,以便強制轉換適用于整個表達式,盡管為了清楚起見,我強烈建議使用括號。

(int)?2147483648L?-?1??//?It's?2147483647!

對超出范圍的文字int進行強制轉換將產生 -2147483648,一個有效值。這里減 1 涉及負方向溢出,產生預期值 2147483647。longintint


查看完整回答
反對 回復 2023-07-19
  • 1 回答
  • 0 關注
  • 117 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號