より良い質問は、整数オーバーフローが未定義の動作である理由です。実際には、すべてのCPUの99.9%が2の補数とキャリー/オーバーフロービットを使用します。したがって、現実の世界では、アセンブラ/オペコードレベルでは、整数のオーバーフローは常に明確に定義されています。実際、多くのアセンブラー、またはハードウェア関連のCは、明確に定義された整数のオーバーフロー(特にタイマーハードウェアのドライバー)に大きく依存しています。
標準化前の元のC言語は、おそらくこのようなことを詳細に考慮していませんでした。しかし、CがANSIとISOによって標準化されたとき、それらは特定の標準化規則に従わなければなりませんでした。ISO規格は、特定のテクノロジーに偏って、それによって特定の企業に競争上の優位性を与えることは許可されていません。
そのため、一部のCPUは、補数、「符号と大きさ」、「実装で定義された方法」などのあいまいなものを実装する可能性があることを考慮しなければなりませんでした。彼らは、符号付きゼロ、パディングビット、およびその他のあいまいな符号付き整数メカニズムを許可する必要がありました。
そのため、符号付き数値の振る舞いは素晴らしく曖昧になりました。符号付き整数は2の補数、1の補数、または場合によっては他の実装定義の狂気で表現される可能性があるため、Cの符号付き整数がオーバーフローしたときに何が起こるかはわかりません。したがって、整数のオーバーフローは未定義の動作です。
この問題の正しい解決策は、いくつかの安全な範囲チェックを発明することではなく、C言語のすべての符号付き整数が2の補数形式であると述べることです。その場合、unsigned charは常に0から127になり、オーバーフローは-128になり、すべてが明確に定義されます。しかし、人工的な標準官僚機構は、標準が正気になるのを防ぎます。
C規格にはこのような問題がたくさんあります。アラインメント/パディング、エンディアンなど。