2つの符号なし数値を掛け合わせたときの乗算結果と2つの符号付き数値を掛け合わせた結果の違いは何ですか?符号付き2進数と符号付き2進数除算
2つの符号付き数値を2つの符号なし数値に分割するときの剰余と商の差は何ですか?
2つの符号なし数値を掛け合わせたときの乗算結果と2つの符号付き数値を掛け合わせた結果の違いは何ですか?符号付き2進数と符号付き2進数除算
2つの符号付き数値を2つの符号なし数値に分割するときの剰余と商の差は何ですか?
例が点灯している可能性があります。
module top;
reg [3:0] a;
reg [3:0] b;
reg [7:0] r1;
reg [7:0] r2;
initial begin
a = 4'hc;
b = 4'h5;
r1 = a * b; // 12 * 5
r2 = $signed(a) * $signed(b); //-4 * 5
$display("r1 = %b", r1);
$display("r2 = %b", r2);
end
endmodule
結果:
r1 = 00111100 (60)
r2 = 11101100 (-20)
差が符号付きの数が表現できる数値の範囲をシフト符号の指標としてベクトルのMSBを(ない実際、本を読んでいない、hereを参照)を利用することです
[0..2^n-1]
から注意すべき点がいくつ
[-2^(n-1)..2^(n-1)-1]
へ
reg signed [3:0] foo
のように、または$signed
のシステムタスクにマークを付けることができます。後者は、あなたが署名されたものとして扱いたいサブ式を持っている場合にしばしば役に立ちます。例えば、元のvarが署名されていても、ベクトルのスライスを取ることは常に符号なしです。2の厳密な出力を扱うのが通常合成可能でない限り、Verilogの動作区分は基本的に同じです。 Verilogで符号なしの算術対署名付き
ブライアンの例に基づいて少しだけ異なるビュー
は符号伝播と関係演算の違いを引き起こします。 2の補数データに対する正規の算術演算は、符号拡張が含まれていない場合に符号付きおよび符号なしの場合と同じ結果をもたらします。
この場合、r1とr2がサイズ4の場合(オペランドとして)同じ結果:
r1 = 1100 was (60)
r2 = 1100 was (-20)
ブライアンの場合、式の結果のサイズは8です。 Verilogは、8ビット空間を占有するようにオペランドを拡張します。署名の場合、「」それはそれを拡張歌いますと、これは違いを生むだろう。だから、
unsigned a[3:0] <1100> --> tmp[7:0] --> 00001100
signed a[3:0] <1100> --> tmp[7:0] --> 11111100
、[3]「1」、それは記号とみなされているとに昇格は符号入った場合左。今、あなたの算術は、次のようになります。
unsigned: tmpa(00001100) * tmpb(00000101) --> 00111100
signed: tmpa(11111100) * tmpb(00000101) --> 11101100
あなたは整数として2番目の結果を表示すると、それはまだサインは32ビットに拡張され、(-20)
として表示されます