short s1 = 1; s1 = s1 + 1;有錯(cuò)嗎?short s1 = 1; s1 += 1;有錯(cuò)嗎?
先說一下Java的基本數(shù)據(jù)類型轉(zhuǎn)換規(guī)則,大的數(shù)據(jù)類型轉(zhuǎn)換為小的數(shù)據(jù)類型需要強(qiáng)制轉(zhuǎn)換,反之可以自動轉(zhuǎn)換。
賦值表達(dá)式等號兩側(cè)的轉(zhuǎn)換的規(guī)則是右側(cè)的向左側(cè)的看齊,即右側(cè)表達(dá)式要轉(zhuǎn)換到和左邊的類型一樣。
那么short s1 = 1; s1 = s1 + 1;的運(yùn)行就是錯(cuò)的。因?yàn)閟1 + 1中,s1是short類型,1是int型,s1會自動轉(zhuǎn)換為int型的1,與1相加后,得到int型的2,然后要向左側(cè)的short類型的s1看齊,即需要通過強(qiáng)制類型轉(zhuǎn)換將int型的結(jié)果轉(zhuǎn)換成short型才賦值給s1。正確寫法是:s1 = (short) (s1 + 1);。
接著short s1 = 1; s1 += 1;的運(yùn)行是正確的。因?yàn)閳?zhí)行s1+=1時(shí),其實(shí)執(zhí)行的是s1 = (short) (s1 + 1); 其中會有一個(gè)隱藏起來的強(qiáng)制轉(zhuǎn)換的過程,所以是運(yùn)行正確的。
最后short s1=1,s2=1;short s3=s1+s2;的運(yùn)行就是錯(cuò)的。這里是編譯器從數(shù)據(jù)安全方面考慮,如果s1和s2都是較大的short類型數(shù)據(jù)值,那么它們加起來就會超出short型的取值范圍,可能會導(dǎo)致溢出,所以會要求將short型強(qiáng)制轉(zhuǎn)換到int型。正確寫法是:short s3 = (int)s1 + s2;。