オーバーフロー、アンダーフローの用語の使い方と、それに類似する用語について


## 質問

しばしば負のオーバーフローのことをアンダーフローと呼んでしまうという誤解がありますが、それに類似する話として質問があります。

とあるプログラムにおいて「日時」を扱っているのですが、一般的に時刻は hh:mm:ss で、`0 <= hh <= 23`, `0 <= mm <=
59`, `0 <= ss <= 59` のような範囲があると思います。最小の時刻は `00:00:00` で最大の時刻は `23:59:59`
というように。

このとき、便宜的にその範囲を超えて値を指定できる機能を作りたいとします。

例えば、`06:10:50` の30秒後を `06:10:80` と指定できるような機能です。この指定が行われたとき、時刻を `06:11:20`
に正規化したいという具合です。

今回質問したいのは、その実装についてではなく、用語についてです。

このように「秒」が 59
を超えていることを指して、「秒の値がオーバーフローしている場合」という表現は適切なのでしょうか。「秒が59を超えている場合」を指す適切な専門用語がないのかと思って質問させていただきました。

また同様に、`1970/09/01` のような日付があるとき、`1970/09/00` を `1970/08/31`
として扱う、というようなことがあると思いますが、これに対して「日の値がアンダーフローしている場合」という表現は適切なのでしょうか。これは不適切に思いますが、だからといって「日の値が負のオーバーフローが生じている場合」のように言うのもおかしいと思っています（`00`
は負ではないので）。

  * 時刻や日付が、通常の日時表記の値の範囲外になる場合のことを指す適切な用語があれば教えていただきたいです。
  * 前述のように、これらを「オーバーフロー」または「アンダーフロー」と表現するのが不適切であれば、それが如何に不適切であるか（誤用であるか）について説明していただきたいです。

そもそもオーバーフローという用語が何を指すかという話にも立ち入りそうですが、このような疑問を持っている私にアドバイスをいただければ幸いです。

## 背景

とあるプロジェクトで共同開発しているのですが、そのプロジェクトのドキュメントに別の方が「秒の値がオーバーフローしている場合」、「日の値がアンダーフローしている場合」のように記述していて、より適切な表現がないか気になったという背景があります。




まあ普通に [c](/questions/tagged/c "'c' のタグが付いた質問を表示")
プログラマがオーバーフローアンダーフローというときは特定ビット数サイズの整数なり浮動小数点数なりにおいて  
オーバーフローは絶対値が大きい方向に表現できなくなった場合  
アンダーフローは絶対値が０方向に精度が失われる場合

カレンダーに関しては下記のようなプログラムを普通に書きますし、動作保証されているはずです。

[code]

    #include <stdio.h>
    #include <time.h>
    
    int main() {
        struct tm t1 = {
            50, 10, 6, /* 06:10:50 */
            30, 2-1,  2023-1900, /* 2023/Feb/30 */
            /* omit following member */
        };
        t1.tm_sec += 30;
        time_t t2 = mktime(&t1);
        printf("%s\n", ctime(&t2));
    }
    
[/code]

なので、これをオーバーフローとかアンダーフローとか呼ぶのは違和感があります。あえて言うなら「非正規表現」とか「非厳密表現」とでも言いましょうか。例えば
[java](/questions/tagged/java "'java' のタグが付いた質問を表示") の
[Calendar](https://docs.oracle.com/javase/jp/8/docs/api/java/util/Calendar.html)
クラスの解説とか。

ちなみにこの辺の関数の仕様上はうるう秒には標準対応しているので秒は [0, 60] が有効範囲とされています。うるう秒を実装しているかどうかは別問題。

