応用情報技術者試験 令和3年秋 午前問8 解説付き過去問
問題
演算レジスタが16ビットのCPUで符号付き16ビット整数x1、x2を16ビット符号付き加算(x1+x2)するときに、全てのx1、x2の組合せにおいて加算結果がオーバーフローしないものはどれか。
ここで、|x|はxの絶対値を表し、負数は2の補数で表すものとする。
正解
解説
この問題では、16ビットのCPUで符号付き整数を加算する際のオーバーフローが発生しない条件を理解する必要があります。符号付き整数の加算においてオーバーフローが起きる状況と、それを防ぐ条件について詳しく解説します。
- 符号付き整数の範囲とオーバーフロー
16ビット符号付き整数の範囲は−32,768から32,767です。この範囲を超えた値を生成する加算はオーバーフローを引き起こします。例えば、32,767 (最大値) に1を加えると −32,768 (最小値) にラップアラウンドし、これは明らかに期待される結果ではありません。 - 符号が異なる場合の加算
符号が異なる2つの整数を加算する場合、絶対値が大きい方から小さい方を引く形になるため、結果の絶対値は元の数値のどちらかよりも必ず小さくなります。例えば、−10,000と5,000の加算結果は−5,000で、これは16ビット整数の範囲内に収まります。したがって、この条件ではオーバーフローが発生する可能性は低いです。 - 他の選択肢の問題点
「|x1|+|x2|≦32,768の場合」では、例えばx1=32,768とx2=0のとき問題があります。符号付き整数として32,768は表現できません。「|x1|及び|x2|がともに32,767未満の場合」についても、x1=32,766とx2=1の場合に32,767を超える値となりオーバーフローします。「x1×x2>0の場合」は、同符号の加算で絶対値が増大するため、特に正の最大値近くでオーバーフローが発生しやすくなります。
したがって、正解は「x1とx2の符号が異なる場合」です。この場合に限り、加算結果がオーバーフローせず、安全に計算を行うことが可能です。