2017-03-13 12 views
0

unsignedタイプのオブジェクトに範囲外の値を割り当てると、結果は、ターゲットタイプが保持できる値のモジュロ値の剰余になります。これは当然です。ただし、範囲外の値をsignedタイプのオブジェクトに割り当てると、結果はで、定義されていないのはです。なぜ、C++標準では、unsignedの場合のように、この動作の正確な結果を定義していないのですか?C++で範囲外の値を符号付きの型のオブジェクトに代入した結果が定義されていないのはなぜですか?

+0

'signed'整数オーバーフローをどのように定義しますか? 'INT_MAX + 1'の結果は何ですか? – mch

答えて

1

一部のプロセッサでは、算術的な打ち切りに関するハードウェア例外が発生するためです。振る舞いを定義するために、C++コードはほぼすべてのalu命令の間にトラップを挿入しなければならず、プログラムをクロールする速度が遅くなります。

+0

Cでは、*既存の*整数値を保持するには小さすぎる符号付き型に割り当てる*の動作は、実装定義の値を格納するか、実装定義の信号を生成するかのいずれかとして定義されます。私は64ビット符号なし整数型(CとC++両方の現在の標準で必要とされる)をサポートする非2の補数系を知らないので、トラップを避けることは問題になるとは思わない。一方、いくつかのアプリケーションでは、オーバーフローを捕捉することは有用かもしれませんが、コンパイラの作者は、どのような形のトラップが有用であるかを決める際に自分の判断を使うことができます... – supercat

+0

...そのようなもの。残念ながら、Undefined Behaviorは、「どのような方法でも、その意図された目的に最も適した実装をするように振る舞う」と言われていましたが[スタンダードの著者が*そう言うことは、コンパイラー作家がさもなければ、意図された目的に適さない振る舞いを実装する]コンパイラの作者は、コンパイラの特定の目的に対する適合性は、標準に準拠したものにすぎないと考えているようです。 – supercat

関連する問題