我有基本的二进制数学问题。例如;
var arr = ['abc', 'def', 'ghi'];
var pzz = ['jkl', 'lmn', 'opq'];
function valueIn() {
for (i = 0; i < arguments.length; i++) {
v = arguments[i];
console.log(v[v.length - 1]);
}
}
valueIn(arr, pzz);
我知道c = a - b将导致零,并且不会设置溢出标志。
我的理解是ALU使用2次补充的减数(运算符的右侧)并将其添加到minuend(运算符的左侧)。
因此,存储在reg b中的值的2s补码为32&amp; h1。现在,如果我将其添加到reg a,我将得到32个零和1,这是溢出。那为什么不设置溢出标志?
即使我将reg c的宽度更改为33,c [32]也不会设置为1.我知道当减去两个相等的数字时,没有溢出但是当我做2s补码数学时我得到溢出。
让我帮助我清除这种困惑。 感谢您的时间。
答案 0 :(得分:1)
a
,b
和c
都是32位无符号变量,并且您正在执行32位算术运算。 LRM表示算术运算的结果宽度是其最大操作数的宽度。因此溢出或第33位被截断。即使将c
扩展到33位,这一事实仍然存在。
答案 1 :(得分:1)
你必须看看两个补充是什么。因此,在您的示例中,a
和b
是32位向量,所有位都设置为&#39; 1&#39;:
a[31:0] = 32'hFFFF_FFFF;
这两个补充是32&#39; h0000_0001;因此,将其添加到b
将导致所有设置为0
并溢出位33
被截断,因为操作的宽度为32位。
现在,据说你有一个33位向量
a[32:0] = 33'hFFFF_FFFF;
这两个补码将是33'h1_OOOO_OOO1
。因此,如果将其添加到33位向量33'hFFFF_FFFF
,您仍将使所有33位等于&#39; 0&#39;。如果您向a
添加更多位,则会向msb端添加更多1
:34'h3_0000_0001
,...
并且,如果c
比操作上下文宽,则对于无符号变量,它将始终为0扩展,否则为符号扩展。
因此,当溢出位超出操作宽度并被截断时,您将始终处于最终状态。这可以通过操作宽度的LRM要求来保证。