はじめに
C言語において、符号なし整数の演算を実施して、符号なし整数の最大値を超えた場合、決してオーバーフローせず、代わりにラップアラウンドします。それを表現可能な最大数の剰余 となると言っているようです。それではいってみましょう。
具体的には:
- 符号なし整数の演算結果が、その型で表現できる最大値を超えた場合、結果は自動的にその型で表現可能な範囲内の値になります.
- この動作は「符号無し整数のラップアラウンド」(unsigned integer wrapping)と呼ばれています.
- ラップアラウンドが発生する可能性のある演算子には、加算(+)、減算(-)、乗算(*)、除算(/)、剰余(%)などがあります.
- 例えば、8ビットの符号なし整数(0から255の範囲)で255 + 1を計算すると、結果は0になる。
この動作は言語仕様で定義されており、予測可能です。
しかし、意図しないラップアラウンドはバグやセキュリティ脆弱性につながる可能性があるため、注意が必要です.
プログラマーは、
必要に応じてラップアラウンドを防ぐためのチェックを実装したり、より大きな整数型を使用したりすることが推奨されます
最後に
言語仕様できめられている符号無し整数のラップアラウンドについて記してみました。分かっているが、言葉で書くと難しいですね。
コメント