计算机中有符号数采用补码进行运算。
溢出的判断
1.在加法运算中,如果次高位(数值位最高位)相加形成进位,而最高位(符号位)相加(包括次高位的进位)却没有进位时,则结果溢出。或则相反,如果次高位无进位,而最高位有进位则结果溢出。
2.在减法运算中,如果次高位不需要借位,而最高位需要借位,则结果溢出。或者相反,如果次高位需要借位,而最高位不需借位,则结果溢出。
怎么理解呢:其实减法运算等价于加法运算,因此溢出只会发生在两个正数相加或者两个负数相加。
而两个整数相加发生溢出时,次高位(数值位最高位)相加形成进位,而最高位(符号位)相加(包括次高位的进位)没有进位时,此时符号位由0变1,产生溢出。
两个负数相加时,次高位无进位,而最高位有进位,此时符号位由1变0,产生溢出。
来看看这个题。
Assume that you have two 8-bit 2’s complement numbers, a[7:0] and b[7:0]. These numbers are added to produce s[7:0]. Also compute whether a (signed) overflow has occurred.
module top_module (
input [7:0] a,
input [7:0] b,
output [7:0] s,
output overflow
); //
assign s = a+b;
assign overflow = (~s[7]&a[7]&b[7])|(s[7]&(~a[7])&(~b[7]));
// assign s = ...
// assign overflow = ...
endmodule
解题思路就是根据两个正数相加和两个负数相加产生溢出的情况。