概要
主に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"されていく。)