Java 桁の大きいLongがマイナスの数字になってしまう

しょぼい失敗ではありますが。(´・ω・`)

例えば、31日間のミリセカンドを取得すべく下記のように定義したとします。

public static final long THIRTY_ONE_DAYS_MILL_SEC = 31 * 24 * 60 * 60 * 1000;

この数字は、2,678,400,000です。
26億7840万ミリ秒ですね。

ですが、これを実行すると、実際には、THIRTY_ONE_DAYS_MILL_SEC

-1616567296 

という数字が入っています。マイナスの数字になってしまってるんですよー。

なんで?というと、次のようなことが起きているらしい。

①右辺で計算する時はintで計算されている

②intの最大値が int32ビット-2,147,483,648 〜 2,147,483,64

③桁あふれでマイナス値になってしまっている

なので、右辺で計算するときにlongであると宣言してあげないと、 2,678,400,000 にならないらしいのです…。

末尾にLをつけるだけ。

正しくは、下記の通り。


public static final long THIRTY_ONE_DAYS_MILL_SEC = 31 * 24 * 60 * 60 * 1000L;


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です