Verilog有符號數與無符號數的數值運算

2021-09-16 13:56:59 字數 3500 閱讀 3811

1.高位溢位賦給乙個位寬不夠的數

高位截斷,保留低位 ;

2.高位溢位賦給乙個位寬足夠的數

結果正確;

3.對中間結果移位

可以看出是先賦值再移位的;

結果正確,左邊補0; 

>>>算數右移,無符號數還是補0; 

1.正常運算

2.賦給位寬不夠的數

捨棄高位 ;

3.賦給位寬足夠的數

wire signed [3:0] a=4'b0111;

wire signed [3:0] b=4'b0010;

wire signed [4:0] c;

assign c =a + b;

4.給中間結果移位

wire signed [3:0] a=4'b1001;//-7

wire signed [3:0] b=4'b1110;//-2

wire signed [3:0] c;

assign c =(( a + b ) >> 1); //-9=10111

wire signed [3:0] a=4'b0111;//7

wire signed [3:0] b=4'b0010;//2

wire signed [3:0] c;

assign c =(( a + b ) >> 1);//9=01001

邏輯右移,高位都是都是補0;

wire signed [3:0] a=4'b1001;//-7

wire signed [3:0] b=4'b1110;//-2

wire signed [4:0] c;

assign c = ((a + b)>>>1) ;//-9=10111

>>>算數右移,截斷賦值然後把最高位當符號位,補最高位 ;

總結:>>邏輯右移,不管有符號還是無符號,都是補0;

>>>算術右移,補最高位;

1.只有兩個運算元都是有符號數,才會把兩個運算元都看作有符號數計算,否則無論是有符號數還是無符號數都會按照無符號數計算 ;

wire  [3:0] a=4'b1001;

wire signed [3:0] b=4'b1110;

wire signed [4:0] c;

assign c = ((a + b)>>>1);  //-9=10111

還是把c當做無符號數移位; 

2.把a賦給b,若a是有符號數,則b高位用a的最高位填充,若a是無符號數,b的高位用0填充 ;

wire  [3:0] a=4'b1001;

wire signed [3:0] b=4'b1001;

wire signed [4:0] c,d;

assign c=a;

assign d=b;

Verilog 有符號數與無符號數運算

無符號數運算,左值位寬不夠,發生截斷的現象 2.兩個無符號數運算,賦值給乙個有符號的數。可以看出,右側先按照無符號數進行運算,取得的運算結果按照左側的符號進行資料顯示。3.兩個無符號數運算,無符號數賦負值 補碼 按照該補碼對應的正值進行處理。結果同上。4.有符號數和無符號數運算,賦值給有符號數。補碼...

有符號數與無符號數

關於有符號數和無符號數的一些重要知識點,包括它們在記憶體中的儲存方式 互相轉換 越界計算等。大家肯定都知道,對於有符號數,資料型別的最高位用於標示資料的符號,最高位為1表示負數,最高位為0表示正數,那麼今天我們主要就此討論乙個問題 在計算機內部具體是如何表示有符號數呢?在計算機內部是通過補碼的方式來...

無符號數與有符號數比較

2012 04 24 19 30 2555人閱讀收藏 舉報擴充套件 先出幾個題目,再解釋一下為什麼答案是那樣的。題目一 int a 1 unsigned int b 1 printf d a b 結果輸出 1 因為無符號數與有符號數比較時,要將有符號數轉化為無符號數,再來比較。a轉化為無符號數後就是...