無符號數運算,左值位寬不夠,發生截斷的現象
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轉化為無符號數後就是...