Javaの暗いintオーバーフローはもちろん

1439 ワード

まず前のコードで簡単に問題を紹介します.
	long now = System.currentTimeMillis();
				long m1 = now-1000*60*60*24*30*3; 
				long test = (long)1000*60*60*24*30*3;
				long nocast = 1000L*60*60*24*30*3;
				long m2 = now-1000L*60*60*24*30*3;
				
				System.out.println("  test:"+test);
				System.out.println(nocast);
				System.out.println("now:"+now);
				System.out.println("m1:"+m1); 
				System.out.println("m2:"+m2);

出力結果:
  test:7776000000
7776000000
now:1359510417546
m1:1360324352138
m2:1351734417546

ちょっとおかしいかな1000*60*60*24*30*3の計算値と1000 L*60*60*24*30*3の計算値が違う1000*60*60*24*30*3の計算結果は-813934592
(long)1000*60*60*24*30*3;  1000L*60*60*24*30*3;の計算結果は777600000という結果が必要です
Javaは乗算時に特定のデータ型が表示されない場合、intデータ型に従って1000*60*60*24*30*3のようにデフォルトで計算されます.この数値は計算時にintデータがオーバーフローするため、負の数が発生します.
(long)1000*60*60*24*30*3;  1000L*60*60*24*30*3;この両者は,前者は最初の計算数をlongに強制的に造形し,longタイプに従って演算して正確な計算結果を得,後者は計算時にデータ型をlongに変更して直接正確な計算結果を得ることができ,異曲同工である.
この点はまだ暗いので、後で間違いをしないように注意しなければなりません.この間違いは調べにくいと思う.
もう一つはLの位置で、1000 L*60*60*24*30*3がおかしいです.1000*60L*60*24*30*3;1000*60*60L*24*30*3;1000*60*60*24*30L*3;このいくつかの書き方はすべて正しくlong型に変えることができて、しかし1000*60*60*24*30*3 L;間違っています.そして、3*60*60*24*30*1000という書き方の場合、Lはどの数字の後ろに付いても大丈夫です.ちょっとわけがわからなくて、使う時debugテストはこの列の計算結果を優先的に確定します.