x=1000 ビット、y=500 ビットの場合、x+y と xy の最長の長さは?
参考までに: x+y と 750k の場合、答えは 1500 であってはなりません。そのため、私は混乱しています :(
x=1000 ビット、y=500 ビットの場合、x+y と xy の最長の長さは?
参考までに: x+y と 750k の場合、答えは 1500 であってはなりません。そのため、私は混乱しています :(
+
答えは、オーバーフローを処理する方法 (および関数とを定義する方法) によって異なります*
。
var:bitwidth
変数にビット幅ビットがあることを意味する表記法を採用しましょう。これは、次の宣言があることを意味します。
x:1000
y:500
さらに、これらはバイエンディアン順 (右端のビットが最小のビット、左端が最大のビット) で格納されるという規則を採用しています。x+y
オーバーフロー ビットを処理するには 1001 が必要であるとすぐに結論付けます。つまり、
z0:1000, z1:1001
z0 = x + y //overflow possible, ex: x=2^1000-1, y=1
z1 = x + y //overflow not possible
かけ算はもっと難しいa:8
ですb:8
。
a:8, b:8
a = 11111111b //= 255
b = 11111111b //= 255
a * b == 1111111000000001 //=65025
//16 bits
乗算に必要なビット数はビットの合計であると予想するのは合理的です。
x:1000, y:5000
z:1500
z2:1499
z = x * y //would not have overflow
z2 = x * y //could have overflow
とはいえ、通常のマイクロプロセッサは大きい方の ( ) の幅を使用するだけで、:1000
オーバーフローをドロップするか、オーバーフロー ビットを設定します。だから答えは:1000
or:1000
プラス:1