どうしてJAVAの中でlongの後にLをプラスしますか?floatはFをプラスしますか?

2304 ワード

問題の背景
今日はコードを書く時、前の変数を修正しました。シングルテストを実行している時に、シングルテストができなくなりました。ちょっと疑問があります。
元のコードを簡略化すると:
count = 123;
Long MAX_SIZE = 3 * 1024 * 1024 * 1024L;
if (count > MAX_SIZE) {
   do error   
}
変更後のコード:
count = 123;
long MAX_SIZE = 3 * 1024 * 1024 * 1024;
if (count > MAX_SIZE) {
  do error   
}
今回の修正は主に毎回箱を外さないようにします。その結果、if条件はtrueになり、異常フローの処理ロジックが実行されました。
原因
javaの整数のデフォルトはintで、3*1024*1024*1024はintの最大値を超えています(2の31乗-1=2147483648-1=2147483647)、オーバーフローが-1073741824に変化したため、上記の問題が発生しました。
知識のポイント
javaの整型はデフォルトではintですが、longに切り替えるのは安全ですので、自動的に回転してコンパイルできます。浮動小数点数はFをつけないで、デフォルトはdoubleタイプで、doubleはfloatを回転して精度を失うかもしれなくて、自動的に回転することができないため、コンパイルは通りません。
変換の目的のタイプは空間範囲を占めて必ず転化のソースタイプの順方向過程より大きくならなければなりません。低バイトから高バイトに自動変換されたbyte->shot->>long->float->double逆方向の過程は自動的に回転しません。コンパイルは通りませんが、強制変換を使って、精度を失うかもしれません。