1.首先我们要知道在计算机数都是以二进制的补码形式存在的
2.要知道原码、反码、补码这三个概念
正数的原码、反码、补码都一样;
负数的原码是本身,反码是符号位不变,其他位按位取反,补码是反码加1;
3.回归正题,所以对于有符号数10000000,我们显然知道它是一个负数,我们想把它变成对应的十进制数应该先写出它的原码;负数原码的求法是:符号位不变,其他位减一取反;我们可以得到10000000,所以它的原码看起来是一个-0,我们将它约定成为-128;
这也是为什么,8位有符号数,取值范围是-128,127的原因
经过了下面的代码验证上面论述的正确性
module try1;
logic [7:0] a = 8'b10000000;//128
bit [7:0] b = 8'b10000000;//128
byte signed_vec = 8'b10000000;//-128
byte signed_vec1 = 8'b00000000;//0
byte signed_vec2 = 8'b11111111;//-1
byte signed_vec3 = 8'b01111111;//127
bit [8:0] result_vec;
initial begin
$display("a = %d",a);
$display("b = %d",b);
$display("signed_vec = %d",signed_vec);
$display("signed_vec1 = %d",signed_vec1);
$display("signed_vec2 = %d",signed_vec2);
$display("signed_vec3 = %d",signed_vec3);
result_vec = signed_vec;//180
$display("1--result_vec = 'h%x",result_vec);
result_vec = unsigned'(signed_vec);//080
$display("2--result_vec = %h",result_vec);
end
endmodule;