• 简单而又深刻的认识:原码、补码、反码


    整数类型的储存

    前面 所说的位运算都没有涉及负数,都假设这些运算是在unsingned/word类型(只能表示正数的整型)上进行操作。

    但计算机如何处理有正负符号的整型呢?这个设计到补码,反码知识点,请看下面

           假设有一 int 类型的数,值为5,那么,我们知道它在计算机中表示为:00000000 00000000 00000000 00000101
    5转换成二进制是101,不过int类型的数占用4字节(32位),所以前面填了一堆0。
           现在想知道,-5在计算机中如何表示?
          在计算机中,负数以其正值的补码形式表达

          什么叫补码呢?这得从原码,反码说起。

    反码,补码

           反码和补码的目的就是为了解决负数的问题
           在计算机内,定点数有3种表示法:原码、反码和补码

           所谓原码就是前面所介绍的二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。


    反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。

    补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。

          有原码就可以了,为什么还需要反码和补码?

           

          反码是用来算补码的,原码和补码都是用在CPU的基本运算里的,比如数据类型是short:   
          计算5   -   2,并由于实际上CPU没有实现减法电路(注:计算机的硬件结构中只有加法器,所以大部分的运算都必须最终转换为加法,原码没有办法做减法,而在我们使用的汇编、C等其他高级语言中使用的都是原码,原码转换成补码都是在计算机的最底层进行的)。原码计算是   5+(-2)

         0101

      +1010

      -------  

          1111 


      =-7?显然出错
     所以不管正数还是负数,都使用补码来表示(正数原码和补码是一样的),  2的补码是1110,然后用5补   +   2补   
          0101   
      +  1110   
      ------   
          0011   

      =3,正确

  • 相关阅读:
    GDB 用法
    C编程规范
    PHP面向对象
    cron定时任务
    Apatche配置基础
    正则表达式笔记
    PHP在windows下命令行方式
    面试题
    struts与ajax的关系
    ORACLE DUAL表详解
  • 原文地址:https://www.cnblogs.com/p2liu/p/6048753.html
Copyright © 2020-2023  润新知