在计算机中,负数以其正值的补码形式表达。
对于任何学过汇编语言的人恐怕都不会忘记怎样求一个二进制数的相反数:“取反加一”嘛。当时觉得这个规则的确有点儿“二”。不过没想那么多,当时已经被刚刚接触到的2进制和16进制冲击地有点儿蒙了。反正挺简单,记住就是了。做两个练习之后想忘都忘不掉了。:-)
现在回过头来想想,是啊,为啥捏?为啥搞得这么复杂呢?你看人家10进制,多人性啊,在前面加上或去掉一个小横杠杠就O了。还有比这个简单的吗?二进制也没理由干这脱了裤子放屁的事儿啊。何况那帮先贤也不是白给的吧,既然有必要设计出这么个反人性的东西出来,背后就一定藏着什么道理。
->答案今天找到了,是这样:还是为了简单!
--何解呢?。。。。。。
->从硬件设计角度的简单!
--------------------------------------------------------------------------------------------------------------
举个例子看看,两个数5和-5相加。
5 的二进制表示:0101b;-5的二进制表示1011;
二者相加:
0 1 0 1
+ 1 0 1 1
----------------
1 0 0 0 0
-> 计算结果当然是0。看出嘛奥妙来了吗?
->提示一下,如果你计算两个无符号数:0101(十进制5)和1011(十进制11)的和,是不是也这样算?
--是啊。但结果是16,也就是10000b
->所以计算有符号和无符号加法的唯一区别就是,计算有符号加法的时候,当置位进位位的时候,忽略之 (所以上面算式的结果是0) 。如果是两个无符号数相加,那么就不要忽略进位位(所以结果是16,即10000b)。
->这样一来整个加法过程(硬件加法器的设计)对于两种运算就可以是完全一样的。只是在处理结果的时候,针对“进位位”的处理不同就可以了。
--------------------------------------------------------------------------------------------------------------------
再举个例子,这样你想忘掉都难了
这回算算5+(-4)
0101(十进制5), 1100(十进制-4)
二者相加:
0 1 0 1
+ 1 1 0 0
----------------
1 0 0 0 1
按照刚学的规则处理结果:有符号数相加,忽略进位标志,取结果:1。结果没错吧。呵呵。
今天你学习了吗?呵呵,:-)
转自:http://blog.****.net/bobantju/article/details/5287112