c新手吧 关注:8,604贴子:48,111

计算机原码,反码,补码详解

只看楼主收藏回复

大家好 《C 和指针》一书中,C 语言中仅有四种数据类型,分别为整型、浮点型、指针型和聚合类型(包含数组和结构体),剩下的类型都是从这四种类型派生或组合而来的。


IP属地:江苏来自Android客户端1楼2015-01-23 15:55回复
    例如字符型char 其实就是一个短整型,而字符串是用字符数组来保存和模拟的。我主要说说整型和浮点型的相关问题。字符串、指针、数组和结构等。整型家族还分为有符号(signed)和无符号(unsigned)两种。整型数无论是否有符号,在计算机内部都是用补码来表示的。理解补码的表示方式有助于我们对整型数溢出的理解,


    IP属地:江苏来自Android客户端3楼2015-01-23 16:02
    回复
      申明一下。本人也不算高手。只是多看了几本书。我尽量以我理解最简单的方式介绍给大家。我不能理解的就只能一书本的介绍了哦


      IP属地:江苏来自Android客户端4楼2015-01-23 16:05
      收起回复
        大家都知道计算机内部是二进制的。为什么是二进制呢。因为电路上只有开与关二种状态。也可以理解有电和没电!分别代表1与0。那大于1怎么办。机智的科学家就接了2根线。再大于呢。就继续接线。现在理解了集成电路了把!好了,物理介绍就到此为止了!(这是抽象的理解。真正的计算机可比这个难多了)下面去正题


        IP属地:江苏来自Android客户端5楼2015-01-23 16:28
        回复
          理解了计算机内部使用的二进制,就来来看看原码、反码和补码的官方定义。
          • 原码:原码是一种计算机中对数字的二进制表示方法,数码序列中最高位为符号位,符号位为0 表示正数,符号位为1表示负数;其余有效值部分用二进制的 绝对值表示。


          IP属地:江苏来自Android客户端6楼2015-01-23 16:31
          回复
            上面好像有点懂。别急。还有。
            • 反码:如果机器数是正数,则该机器数的反码与原码一样;如果机器数是负数,则该机器数的反码是对它的原码(符号位除外)各位取反而得到的。• 补码:如果机器数是正数,则该机器数的补码与原码一样;如果机器数是负数,则该机器数的补码是对它的原码(除符号位外)各位取反,并在末位加1。


            IP属地:江苏来自Android客户端7楼2015-01-23 16:32
            收起回复
              mark
              这是第几章?


              IP属地:湖北来自Android客户端8楼2015-01-23 19:12
              收起回复
                感谢吧主留名,好的我们继续哦.
                听过官方定义的原码,反码,补码.后一般人都是糊里糊涂的.其实吧.我个人觉得这个不要了解.毕竟计算机是实用为主的.主要的是理解.等我说完后.你就知道为什么C语言里面有那么多数据类型了。


                IP属地:江苏9楼2015-01-23 19:29
                回复
                  不了解怎么办呢。其实我们可以通过画几个图把概念简单地阐述清楚。为了方便说明问题,我就用用4 位二进制数表示一个整数。(其实一般32位的电脑32位编译器用32位表示一个整数。同样64位的编译器就是64位表示一个数哦。至于为什么使用4位。因为再大一点我就不算不出来呢


                  IP属地:江苏10楼2015-01-23 19:41
                  收起回复

                    无符号数的原码表示方法就是这个图。其中内圈的数字为二进制数,外圈的数。为内圈二进制数所对应的十进制数 。
                    ps:世界上有10种人.一种懂二进制.一种不懂二进制.希望你懂二进制.还知道它与十进制之间如何装换.


                    IP属地:江苏11楼2015-01-23 19:48
                    收起回复
                      好的.顾名思义,无符号数不能表示负数。为了解决这个问题,我们的计算机发明者们把一个数最高位定义为符号位。如果最高位为1 就代表是一个负数,如果是0就是正数.其于位表示对应的十进制数。这就是有符号数的原码表示。 (你可以这样理解为什么1开头是负数呢.你把1横过来就明白了吧我猜的)
                      这也有图哦(
                      我不是发图水经验.我只是试试)


                      IP属地:江苏12楼2015-01-23 19:55
                      回复
                        好.说了这么多.问题来了哦.当然不是挖掘机哪家强呢.不过问下也没事.
                        结合楼上的图.用原码来表示一个有符号数会带来两个问题。第一个问题就是正负相加不等于零。1+(-1),就是0001+1001=1010,按照原码表示等于-2。第二个问题就是有两个零存在,分别为0000 和1000。可见,原码不适合用来表示有符号数!(我不会告诉你其实这就是整型)


                        IP属地:江苏13楼2015-01-23 19:59
                        回复
                          好像现在崩溃了.但是为了保证正负相加等于零,我们的计算机的创造者的想象力是丧心病狂的。
                          发明了反码了。为什么叫反码。或许正的不行我们就用反的吧。
                          如果把二进制数1000 想象成12 点,把二进制数0000 想象成6 点,原码就是从12 点开始顺时针排列-1到-7,而反码就是从6 点开始逆时针排列-1到-7。这样做的好处就在于现在正负数相加等于零了。例如,1+(-1),就是0001+1110=1111,用反码表示的话就是(-0)了。 (我的想象力匮乏。只能想到时钟)
                          来水经验了。不对。是发详细解释发图。


                          IP属地:江苏14楼2015-01-23 20:09
                          回复
                            反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
                            反码威武啊。为我们解决了就是正负相加不等于零
                            可能大家还是不怎么理解哦。我来解释下哦.
                            1100110011 原
                            1011001100 反 除符号位,按位取反。明白了吧。
                            正数的原反是一样的。


                            IP属地:江苏15楼2015-01-23 20:14
                            回复
                              虽然那么反码那么牛逼。但是还是有两个零存在,看14楼图。那就是分别为0000 和1111。说明反码还是有局限性的
                              (反码表示:追我的时候还叫我小甜甜。现在有了新欢就把我忘记了啊)
                              胡扯。补码才不是新欢呢。是我正室。计算机说到。。。太乱了。我写不下去了
                              在计算机中,数据是以补码的形式存储的(为什么呢。因为人家的计算机的正室
                              况且。补码还真有两把刷子。人家就能把2个零的问题给解决掉(难怪叫补码。原来把一个洞给补了啊


                              IP属地:江苏16楼2015-01-23 20:28
                              回复