<b>3.5 運算符</b>
在java中,使用算術運算符+、-、*、/表示加、減、乘、除運算。當參與/運算的兩個操作數都是整數時,表示整數除法;否則,表示浮點除法。整數的求餘操作(有時稱為取模)用%表示。例如,15/2等于7,15%2等于1,15.0/2等于7.5。
需要注意,整數被0除将會産生一個異常,而浮點數被0除将會得到無窮大或nan結果。
注釋:可移植性是java語言的設計目标之一。無論在哪個虛拟機上運作,同一運算應該得到同樣的結果。對于浮點數的算術運算,實作這樣的可移植性是相當困難的。double類型使用64位存儲一個數值,而有些處理器使用80位浮點寄存器。這些寄存器增加了中間過程的計算精度。例如,以下運算:
很多intel處理器計算x * y,并且将結果存儲在80位的寄存器中,再除以z并将結果截斷為64位。這樣可以得到一個更加精确的計算結果,并且還能夠避免産生指數溢出。但是,這個結果可能與始終在64位機器上計算的結果不一樣。是以,java虛拟機的最初規範規定所有的中間計算都必須進行截斷。這種行為遭到了數值計算團體的反對。截斷計算不僅可能導緻溢出,而且由于截斷操作需要消耗時間,是以在計算速度上實際上要比精确計算慢。為此,java程式設計語言承認了最優性能與理想結果之間存在的沖突,并給予了改進。在預設情況下,虛拟機設計者允許對中間計算結果采用擴充的精度。但是,對于使用strictfp關鍵字标記的方法必須使用嚴格的浮點計算來生成可再生的結果。例如,可以把main方法标記為
于是,在main方法中的所有指令都将使用嚴格的浮點計算。如果将一個類标記為strictfp,這個類中的所有方法都要使用嚴格的浮點計算。
實際的計算方式将取決于intel處理器的行為。在預設情況下,中間結果允許使用擴充的指數,但不允許使用擴充的尾數(intel晶片在截斷尾數時并不損失性能)。是以,這兩種方式的差別僅僅在于采用預設的方式不會産生溢出,而采用嚴格的計算有可能産生溢出。
如果沒有仔細閱讀這個注釋,也沒有什麼關系。對大多數程式來說,浮點溢出不屬于大問題。在本書中,将不使用strictfp關鍵字。