簡體   English   中英

類型中的意外行為

[英]unexpected behavior in types

我剛剛使用數據類型short創建了一個簡單的java程序。
該程序如下所示:

class test
{
    public static void main(String arg[])
    {
        short x=1;
        short x_square=x*x;
    }
}

該程序拋出一個錯誤:

java:6: possible loss of precision
found   : int
required: short

編譯器如何創建int 在該程序中沒有int變量,所有變量都聲明為short

在算術運算期間,如果它們都不是long類型,則整數類型在Java中始終被視為int原語。 小整數類型被提升為int ,操作結果為int 因此x*x是類型轉換為int並且您嘗試將其分配為short 你需要一個明確的強制轉換來short轉換范圍。

short x_square=(short)(x*x);

遵循JLS 4.2.2

如果移位運算符以外的整數運算符至少有一個long類型的操作數,則使用64位精度執行運算,並且數值運算符的結果為long類型。 如果另一個操作數不長,則首先將其擴展(第5.1.5節)以通過數字提升(第5.6節)鍵入long。

否則,操作使用32位精度執行,數值運算符的結果為int類型。 如果任一操作數不是int,則首先將其擴展為通過數字提升鍵入int。

規格

如果移位運算符以外的整數運算符至少有一個long類型的操作數,則使用64位精度執行運算,並且數值運算符的結果為long類型。 如果另一個操作數不長,則首先將其擴展(第5.1.5節)以通過數字提升(第5.6節)鍵入long。

否則,操作使用32位精度執行,數值運算符的結果為int類型。 如果任一操作數不是int,則首先將其擴展為通過數字提升鍵入int。

添加short和short會產生一個int。 如果要將結果存儲在int類型的變量中,則必須強制轉換它。

因為兩個short的乘法在java中返回一個int 要消除此錯誤,您需要具有顯式類型轉換:

short x_square=(short)x*x;

或者,您還可以執行以下操作:

short x_square = x; 
x_square *= x_square;

嘗試投射它: short x_square=(short)(x*x)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM