如何保证多个数据运算操作的正确性(原创)
0赞为了方便逻辑器件的运算操作,存储数据时,一般是按照补码的形式,将数据存储起来,然后以补码的形式进行数据的运算操作。由于补码的操作运算可以带来很多方便,故在逻辑器件中,多数的数据操作及运算都是以补码的形式进行的,但是,补码的操作运算同样避免不了一个问题即:由于存储器的位宽一般都是确定的,数据操作的时候会使得运算结果溢出。
现举一个例子加以说明:比如有4个4位宽的数据进行操作,数据是以补码的形式给出的,4 个数据分别是:0110、0101、1001、1110、这四个数代表的实际值应该分别为:3、-5、-6、-2,如果将这四个数进行相加,得到的结果为:
0 0 1 1
+ 1 0 1 1
+ 1 0 1 0
+ 1 1 1 0
————————
= 0 1 1 0 (进位自动丢掉)
代表的实际结果为6,而理想的结果应该为-10。
为了避免上述情况,一个解决办法是增加最后存储器的宽度,由于两个四位数操作,有可能会产生一个五位数的数据,所以上述四个数据操作,可能会产生一个六位数的数据,所以,应该将存储结果的存储器用一六位的存储器进行存储。但是,如果仅仅是将运算结果用6位的存储器进行存储的话,也是不准确的,如上例示,上述四个数相加的结果为:100110,表示的实际结果为26。所以不能只是简单的把存储运算结果的存储器的位宽放宽,还必须对数据进行相应的操作,即扩位。过程如下,比如四个四位数相加,运算结果有可能是一六位数,这时,应该将原来的数据进行扩位,将原操作数据也变成一六位数,但是不是简单的在最前边加两个0,而是根据原数据的最高位进行扩位,如果原来的数据的最高位是1,则应该在原数据前边加上两个1,如果是0,则应该加上两个0。这样儿才能保证运算以后的结果是正确的。还是以上面的数据为例,进行加法操作:
0 0 0 0 1 1
+ 1 1 1 0 1 1
+ 1 1 1 0 1 0
+ 1 1 1 1 1 0
————————
= 1 1 0 1 1 0
代表的实际结果为-10,跟原结果吻合。
