Java解惑三 迴圈之謎

2021-06-22 12:59:55 字數 2432 閱讀 5819

byte是有符號的,範圍是-128 - 127。而0x90是int型別。比較的時候,不相等。
如果想讓其相等,需要進行型別轉換:(byte & 0xff) 或者 (byte)0x99。
自增運算子對迴圈的影響。j = j++,先賦值。
integer.max_value加一之後會變成integer.min_value,這對迴圈會有影響。
可以考慮使用long來表示i變數,或者使用效率更高的i != integer.max_value。
(-1 << 32)的結果是-1而不是0。
對於int型的資料移位運算總是取右端數轉換成2進製的低五位。
對於long型的資料移位運算總是取右端數轉換成2進製的低六位。
32取低五位是0,因此結果是-1。

如果右邊的數是負數,同樣保留低五(六)位,將其轉換為正數。

while(i == i + 1)
當浮點數i足夠大時候, i = i + 1。

相鄰浮點數之間的距離被稱為ulp(unit int the last place),一旦ulp超過2,加一將不會產生任何影響。

二進位制浮點數算術只是一種近似。

while(i != i)
ieee 754浮點算術保留了乙個特殊的值:nan(not a number)。
double i = 0.0 / 0.0,double i = double.nan,
任何浮點數操作,只要乙個或多個運算元為nan,那麼結果是nan。
nan不等於任何浮點數,包括它自身。nan  != nan 。
while(i != i + 0)
i != i + 0,如果i是string型別。此時的+就不是算術加號了,被過載為字串的連線。
while(i != 0)
還是在講型別轉換。
當i為short型別的-1的時候,i >>>= 1,仍舊是-1:首先將short轉換為int,然後在擷取低位16。
short,byte的任何負數最終都會轉換為-1。而char不會,char是無符號的。
integer i = new integer(0);

integer j = new integer(0);

while(i <= j && i >= j && i != j)

包裝類,當使用==運算子時候,並不是判斷值相等,而是引用(相容性考慮)。<=或者》= 都是值判斷。

while(i != 0 && i == -i)
整數的邊界問題
0x8000 0000 表示最小的負數(integer.min_value),對其求相反數,仍是其本身。
final int start = 2000000000;

int count = 0;

for (float f = start; f < start + 65; f++)

浮點數精度問題

start+50與start相等,當使用浮點數表示的時候。50比start的ulp距離(128)的一半還小。當超過ulp的距離的一半的時候,無限迴圈。

取餘和乘除具有相同的優先順序。

Java解惑八 很多其它庫之謎

將執行緒的啟動方法start 寫成了run ps 管程 monitor 鎖有待進一步理解。執行緒中鎖的問題。理解不深刻。反射會造成訪問其它包中的非公共型別的成員。引起執行期異常。遮蔽 thread.sleep 方法遮蔽了自定的方法。反射 怎樣例項化非靜態內部類以及靜態內部類。system.out.w...

《java解惑》筆記三

public static void main string args 控制台列印 1e240 7616 7616類似 復合賦值操作符,e1 op e2 等價於 e1 t e1 op e2 其中t是e1的型別。上面的例子中,當進行加法時,會將運算元提公升為int,得到123456,然後會轉化為sho...

java解惑之表示式之謎 謎題8

謎題8 dos equis 這個謎題將測試你對條件操作符 冒號問號操作符 的掌握程式,看下面的程式會列印出什麼結果?public class dosequis 只要對條件操作符了解的都知道第一條列印語句應該列印的是字元x,第二條列印語句也應該列印出字元x,即列印結果應當是xx。而執行後,實際列印出來...