关于原码,反码,补码的一些问题

原码,反码,补码

原码

二进制

十进制转换为二进制:

  1. 整数部分转换‌。

    • 除2取余法‌:将十进制整数反复除以2,记录每次的余数(0或1),直到商为0。最后将余数逆序排列即为二进制结果。例如,十进制数10转换过程如下:
      10 ÷ 2 = 5 余 0
      5 ÷ 2 = 2 余 1
      2 ÷ 2 = 1 余 0
      1 ÷ 2 = 0 余 1
      逆序排列余数得 1010
    • 幂次拆分法‌:通过分解为2的幂次方之和快速转换。例如,19 = 16 + 2 + 1 = 2⁴ + 2¹ + 2⁰,对应二进制 10011
  2. 小数部分转换‌。

    • 乘2取整法

      :将小数部分不断乘以2,取整数部分(0或1),直到小数部分为0或达到精度。例如,0.625转换过程:

      1. 625 × 2 = 1.25 → 取1。

      2. 25 × 2 = 0.5 → 取0。

      3. 5 × 2 = 1 → 取1。

      4. 顺序排列得 0.101

周期数

  1. 周期一般理解是:对于函数y=f(x),如果存在一个不为零的常数T,使得当x取定义域内的每一个值时,f(x+T)=f(x)都成立,那么就把函数y=f(x)叫做周期函数,不为零的常数T叫做这个函数的周期
  2. 那么假设一个数据类型的长度 T 是固定的,在不看符号的情况下,如果赋值s大于长度,则会取消进位,得到f(s)= f(s-T),这个长度T就可看做周期数

原码

原码(true form)是一种计算机中对数字的二进制定点表示方法。原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1(0有两种表示:+0和-0),其余位表示数值的大小。

  1. 以byte为例:一个byte类型的数据,它的长度是8位,则它的周期数就是2^8个数,即256个数

        byte i1 = 30;
    	byte i2 = -30;
    
    

    30的原码是00011110

    -30的原码是10011110

    byte的取值范围是127 ~ -128,总共有256个整数

    其中 -128的原码规定为10000000,因为算上符号位的话 -128的原码应为9位,即110000000

    超过了byte的长度,则将 -0的原码定为 -128的原码

反码

  1. 正数的反码和原码相同

  2. 负数的反码是原码符号位不变,每一个位取反

    例: -30的反码是11100001

补码

  1. 正数的原码,反码,补码都相同
  2. 负数的补码为反码+1,例:-30的原码是10011110,反码是11100001,补码是11100010

以上是补码的计算方法,那么补码的原理是什么呢?

计算机本身在计算数据时是不会将符号位独立出去的,也就是说在计算的时候是要把符号位算作数值来计算的,也就是说计算机不会做减法运算,所以就引入了补码这个设定。

那么计算机减法运算就是[a-b]补=a补+(-b)补

那么补码是怎么来的,为什么负数的补码为其反码+1?

前面提到了周期数这个概念,以byte为例,byte的周期数位28,也就是说超过了28就要重新计数,就会出现x-y=x+28-y的情况,这样就会出现-y=28-y

引入模运算的概念,即-y的补码就等于2^8-y的原码

例:-30的补码为11100010,2^8-30=226的原码为11100010(这里超过byte的取值范围,所以是从计算机运算的角度看,符号位算到数值里)

则可得到结论 50-30=50+226 即 50-30=50+(2^8-30)

posted @ 2025-08-04 17:50  阿飞bean  阅读(34)  评论(0)    收藏  举报