演算レジスタが16ビットのCPUで符号付き16ビット整数x1,x2を16ビット符号付き加算(x1+x2)するときに,全てのx1,x2の組合せにおいて加算結果がオーバフローしないものはどれか。
ここで,|x|はxの絶対値を表し,負数は2の補数で表すものとする。
正答4
解説
正解は4です。
この問題は、2の補数で表した16ビット符号付き整数の加算で、オーバフローが起きない条件を問うています。
16ビットの2の補数で表せる範囲は、-32,768から32,767までです。
和がこの範囲を超えるとオーバフローします。
【選択肢別解説】
1:× |x1|+|x2|≦32,768でも、両方が正ならオーバフローすることがあります。
たとえばx1=x2=16,384のとき、和は32,768となり最大値32,767を超えます。
2:× 絶対値がともに32,767未満でも、同じ符号どうしなら和が範囲を超えます。
たとえば32,766+32,766=65,532となり、オーバフローします。
3:× x1×x2>0は、二つの数が同じ符号であることを意味します。
同符号の加算は絶対値が大きくなるため、たとえば20,000+20,000でオーバフローします。
4:○ 符号が異なる二つの数を足すと、和は必ずx1とx2の間の値になります。
x1とx2はどちらも表現範囲内なので、その間にある和も範囲内に収まり、オーバフローしません。
【ポイント】
2の補数の加算でオーバフローが起こり得るのは、同じ符号どうしを足したときだけです。
正+正の結果が負、負+負の結果が正になったときがオーバフローだと覚えておきましょう。