1
0

More than 3 years have passed since last update.

32bitと64bitの変数を時間として扱った場合に溢れるまでの時間一覧

Last updated at Posted at 2021-01-20

概要

主にC++で int と long long を時刻として割り当てて使った時に、いつ溢れるんだっけと忘れるので、桁あふれ(オーバーフロー)する時間を表にまとめた。
(Excelでやろうとしたらセルの精度不足で、64bitの大きい数値は打ち切り誤差出てしまったので、一部はWindowsの "calc" による手計算。なのでその辺りは誤差乗っているかも。)

なお、型のサイズ一覧は以下等を参照のこと

データ型の範囲 - Microsoft Docs
https://docs.microsoft.com/ja-jp/cpp/cpp/data-type-ranges?view=msvc-160


変数サイズ
ビット数 32 bit 64 bit
バイト数 4 byte 8 byte
最低値(signed) -2,147,483,648 -9,223,372,036,854,775,808
最大値(signed) 2,147,483,647 9,223,372,036,854,775,807
最低値(unsigned) 0 0
最大値(unsigned) 4,294,967,295 18,446,744,073,709,551,615

32bit (signed) の枯渇時期 ※ 0から増加させた場合
使用単位 時間 日数 年数
1秒 596,523 時間 24,855 日 68 年
100ms 59,652 時間 2,486 日 7 年
10ms 5,965 時間 249 日 1 年
1ms 597 時間 25 日 0 年
100us 60 時間 2 日 0 年
10us 6 時間 0 日 0 年
1us 1 時間 0 日 0 年

32bit (unsigned) の枯渇時期
使用単位 時間 日数 年数
1秒 1,193,046 時間 49,710 日 136 年
100ms 119,305 時間 4,971 日 14 年
10ms 11,930 時間 497 日 1 年
1ms 1,193 時間 50 日 0 年
100us 119 時間 5 日 0 年
10us 12 時間 0 日 0 年
1us 1 時間 0 日 0 年

64bit (signed) の枯渇時期 ※ 0から増加させた場合
使用単位 時間 日数 年数
1秒 2,562,047,788,015,216 時間 106,751,991,167,301 日 292,471,208,678 年
100ms 256,204,778,801,522 時間 10,675,199,116,730 日 29,247,120,868 年
10ms 25,620,477,880,152 時間 1,067,519,911,673 日 2,924,712,087 年
1ms 2,562,047,788,015 時間 106,751,991,167 日 292,471,209 年
100us 256,204,778,802 時間 10,675,199,117 日 29,247,121 年
10us 25,620,477,880 時間 1,067,519,912 日 2,924,712 年
1us 2,562,047,788 時間 106,751,991 日 292,471 年
100ns 256,204,779 時間 10,675,199 日 29,247 年
10ns 25,620,478 時間 1,067,520 日 2,925 年
1ns 2,562,048 時間 106,752 日 292 年

64bit (unsigned) の枯渇時期
使用単位 時間 日数 年数
1秒 5,124,095,576,030,431 時間 213,503,982,334,601 日 584,942,417,355 年
100ms 512,409,557,603,043 時間 21,350,398,233,460 日 58,494,241,736 年
10ms 51,240,955,760,304 時間 2,135,039,823,346 日 5,849,424,174 年
1ms 5,124,095,576,030 時間 213,503,982,335 日 584,942,417 年
100us 512,409,557,603 時間 21,350,398,233 日 58,494,242 年
10us 51,240,955,760 時間 2,135,039,823 日 5,849,424 年
1us 5,124,095,576 時間 213,503,982 日 584,942 年
100ns 512,409,558 時間 21,350,398 日 58,494 年
10ns 51,240,956 時間 2,135,040 日 5,849 年
1ns 5,124,096 時間 213,504 日 585 年

まとめ

よほど理由がない限り、思考停止で64bitを使おう。

あと、ありがちなのは・・・

  • 2000年問題 (西暦を下2桁で管理する環境)
  • 2038年問題 (UNIX時間を signed 32bit で扱う環境)
  • GPS/GNSSの19.6年問題 (GPS/GNSS 週数ロールオーバー)

最後に余談、signed で使っておくと、x++;し続けてマイナスに到達したとしても、変数の繰り上がりによるバッファ破壊を起こすことはない(が、言語使用等によって変わるだろうし、おすすめはしない)。
(signedの値は、2進数的に見ると最大値+1=最低値なので自動的にマイナスに突入し、その後は通常通り"+1"されていく。)

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0