1.废话:在进行项目编写的时候发现需要用到补码以表示负数,即使用有符号数。
2.正题:
① 有符号数与无符号数
verilog中的 wire、reg 型变量未特殊申明的情况下默认为无符号数类型;
例如:
wire [4:0] a = 5'b10110;
reg [4:0] b = 5'b11011;
其大小转换为十进制规则为:
而对于有符号数类型,则需在申明时额外加上 signed 申明,其为二进制格式下的补码表示形式;
例如:
wire signed [4:0] a ;
reg signed [4:0] b ;
由于是补码形式,如果第一位数据为 0,表示为正数,其十进制大小的换算仍然用上面的计算规则;如果第一位数据为1,表示为负数,其十进制大小换算规则如下:
(注: 注意累加上限为 B-1,因补码第一位是标志位,不表示数据大小。)
②原码
最高位符号位,0代表正数,1代表负数,非符号位为该数字绝对值的二进制
③反码
正数的反码与原码一致,负数的反码是对原码按位取反,只是最高位(符号位)不变
④补码
正数的补码与原码一致,负数的补码是该数的反码加1
直接上案例:
对于其计算过程:
关于原码、反码、补码的介绍参考blog:原码,反码,补码的概念