原码:

    因为CPU只能做加法,于是人们想到了用这样的办法来实现减法:

1 - 1 = 1 +-1
这样的话:二进制就是(
00000001)原 + (10000001)原 = (10000010)原 = -2 /*原码的二进制最高位0表示正,1表示负*/

  这样做显然结果是不正确的。不正确的原因是在进行加减运算时需要同时考虑数的符号和幅值这两个因素!!!而且,这样做还会带来两个0的情况:+0 = 00000000      -0 = 10000000. 我想啊!CPU只能做加法就是为了精简!要是现在这样做还多了几个累赘!因为它不会这样傻的。嘿嘿!

  反码:

    当是正数的时候呢,它的反码与原码一样!负数呢!就符号位为1,其他位都取反!同理,反码表示依然有上诉情况存在。

  补码:

    补码呢!这里就讲个小故事了!有个成语叫南辕北辙!讲述了一个人要乘车到楚国去,由于选择了相反的方向又不听别人的劝告,只能离楚国越来越远了。告诉我们,无论做什么事,都要首先看准方向,才能充分发挥自己的有利条件;如果方向错了,那么有利条件只会起到相反的作用。其实呢!地球是圆圆的呢!就像选择了相反的方向只要执着的走下去也会到达想要去的地方的!呵呵!只是这样的话,你到达目的地的时间会要得多而已。因为只要到达目的地就行,不会在乎你是从哪个方向来的,因为要的结果是你人在那里了就行。呵呵!不论你在地球上转了多少圈,在终点的那个人永远都不知道你的转了多少圈的。在计算机中,比如一位中,那一位不论怎么加啊加啊,它就只会表达0啊,1啊。

    再说个例子,在十进制数中,现在有一个数是7,你如何做能让它变成1个个位是4的数呢,你可以这样做:7 - 3 = 4;也可以这样做哦!:7 + 7 = 14;你仔细看看,它们的个位都是4吧。这个和南辕北辙也是一个到底。不论你转了地球多少圈圈。这样呢,可以总结为:a, b属于[0, N),而且 a + b = N.这样则可以说这两个数互补!!!也就是a为b的补码,b为a的补码!N就成为模!

    总结:所以呢!现在可以这样总结:要求1个数的补码就是用模去减去这个数,例如:模为10000,我们希望对1001求补,但是呢!这里10000和1001位数不一样不方便做运算,我们就先把10000减1,得到1111,然后用1111减1001这样就得到了0110.这样就知道了一个数的反码和补码相差1,所以在反码的尾数上加1就得到了补码!

  从早上8点思考到现在过去了11个小时,不过总算弄明白了!嘿嘿!!!以前听说指针是C语言的灵魂!现在觉得补码也是灵魂啊,想了很久很久啊!

作者: dodolook 发表于 2011-05-23 19:10 原文链接

推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架
新浪微博粉丝精灵,刷粉丝、刷评论、刷转发、企业商家微博营销必备工具"