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

2021-10-06 07:15:11 字數 4660 閱讀 2671

無符號數運算,左值位寬不夠,發生截斷的現象

2. 兩個無符號數運算,賦值給乙個有符號的數。可以看出,右側先按照無符號數進行運算,取得的運算結果按照左側的符號進行資料顯示。

3. 兩個無符號數運算,無符號數賦負值(補碼)。按照該補碼對應的正值進行處理。結果同上。

4. 有符號數和無符號數運算,賦值給有符號數。補碼進行運算,如果左值位寬不夠,進行截位,取得的結果為:3(4』b0011)。位寬足夠,取得結果為-13(10011)。

5. 有符號數和無符號數的比較

乙個無符號數和乙個有符號數比較,都視為無符號數,按照各自補碼的大小進行比較;

reg               [3:

0] a =15;

//4'b1111

reg [3:

0] b =14;

//4'b1110

reg signed[3

:0] c =-1

;//4'b1111

reg signed[4

:0] d =-2

;//5'b11110

initial begin

if(a <= c) begin

$display

("a <= c");

//成立

endif

(b <= c) begin

$display

("b <= c");

//成立

endif

(c > d) begin

$display

("c > d");

//成立

6. 兩個無符號數已經進行移位。資料先按照左值進行截斷,然後再進行移位。算數右移時,不管左值是否有符號,都按照無符號數進行補零操作。

7.有符號數進行移位。只有參與運算的兩個數都是有符號數,才按照有符號數進行算數右移,補最高位。不然,就補0.

reg  signed[3

:0] a =-7

;//4'b1001

reg [3:

0] b =4;

//4'b0100

reg signed[3

:0] c =4;

//4'b0100

reg signed[3

:0] d ;

reg signed[3

:0] e ;

reg signed[3

:0] f;

initial begin

d =( a + b )

>>1;

//a + b =-3 1101

e =( a + b )

>>

>1;

f =( a + c )

>>

>1;

$display

("d = %d"

,d);

//6 0110

$display

("e = %d"

,e);

//6 0110

$display

("f = %d"

,f);

//-2 1110

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

1.高位溢位賦給乙個位寬不夠的數 高位截斷,保留低位 2.高位溢位賦給乙個位寬足夠的數 結果正確 3.對中間結果移位 可以看出是先賦值再移位的 結果正確,左邊補0 算數右移,無符號數還是補0 1.正常運算 2.賦給位寬不夠的數 捨棄高位 3.賦給位寬足夠的數 wire signed 3 0 a 4 ...

有符號數與無符號數

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

無符號數與有符號數比較

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