计算机的原码、反码、补码的概念及转换

抽时间补了一下这块知识点。接下来,进入正题。

概念

  1. 数据在计算机内部是以补码的形式存储
  2. 数据分为有符号数无符号数
    • 无符号数正数有符号数负数
    • 正数的首位地址为0,其原码是由十进制数转换为二进制数
    • 负数的首位地址是1,其原码是由十进制数转换为二进制数,然后将首位地址改为1
  3. 对于一个数,计算机要使用一定的编码方式进行存储原码、反码、补码是机器存储一个具体数字的编码方式,原码、反码、补码是计算机原理的术语。说白了就是为了理解计算机使用二进制进行运算的原理。

原码

第一位表示符号 其余位表示值

正数: 10 的原码 --> 0000 0000 0000 0000 0000 0000 0000 1010
负数:-10 的原码 --> 1000 0000 0000 0000 0000 0000 0000 1010

注意:二进制的首位标识 该二进制数是一个正数还是负数。 正数为0,负数为1.

反码

  1. 正数的反码 == 原码
  2. 负数的反码是在其原码的基础上,符号位不变,其余各个位取反
正数: 10 的原码 --> 0000 0000 0000 0000 0000 0000 0000 1010
负数:-10 的原码 --> 1000 0000 0000 0000 0000 0000 0000 1010

正数: 10 的反码 --> 0000 0000 0000 0000 0000 0000 0000 1010
负数:-10 的反码 --> 1111 1111 1111 1111 1111 1111 1111 0101

补码

  1. 正数的补码 == 原码
  2. 负数的补码是在其反码的基础上➕1
正数: 10 的原码 --> 0000 0000 0000 0000 0000 0000 0000 1010
负数:-10 的原码 --> 1000 0000 0000 0000 0000 0000 0000 1010

正数: 10 的反码 --> 0000 0000 0000 0000 0000 0000 0000 1010
负数:-10 的反码 --> 1111 1111 1111 1111 1111 1111 1111 0101

正数: 10 的补码 --> 0000 0000 0000 0000 0000 0000 0000 1010
负数:-10 的补码 --> 1111 1111 1111 1111 1111 1111 1111 0110

三种编码方式的用途

计算机只会做加法计算。
当两个正数之间使用原码进行运算就可以解决。

// 由于计算机只会做加法运算,减法运算在计算机的表现形式为
10 + 1

使用原码进行计算如下:
10 转成原码 --> 0000 0000 0000 0000 0000 0000 0000 1010
1  转成原码 --> 0000 0000 0000 0000 0000 0000 0000 0001
两者相加    --> 0000 0000 0000 0000 0000 0000 0000 1011			
// 该原码转成十进制为 11

当正数和负数使用原码运算就会出现问题。

// 由于计算机只会做加法运算,减法运算在计算机的表现形式为
10 - 1 == 10 + (-1)      // 后者为计算机的表现形式

使用原码进行计算如下:
10 转成原码 --> 0000 0000 0000 0000 0000 0000 0000 1010
-1 转成原码 --> 1000 0000 0000 0000 0000 0000 0000 0001
两张相加    --> 1000 0000 0000 0000 0000 0000 0000 1011			
// 该原码转成十进制为 -11

为了解决上面的问题,反码就出现了

// 使用反码进行计算
10 - 1 == 10 + (-1)      // 后者为计算机的表现形式

使用原码进行计算如下:
10 转成原码 --> 0000 0000 0000 0000 0000 0000 0000 1010 --> 转成反码 --> 0000 0000 0000 0000 0000 0000 0000 1010
-1 转成原码 --> 1000 0000 0000 0000 0000 0000 0000 0001 --> 转成反码 --> 1111 1111 1111 1111 1111 1111 1111 1110
10 转成反码   --> 0000 0000 0000 0000 0000 0000 0000 1010
-1 转成反码   --> 1111 1111 1111 1111 1111 1111 1111 1110
两者反码相加 --> 1 0000 0000 0000 0000 0000 0000 0000 1000	
// 左侧超出的部分会被自动去掉,该原码转成十进制为 8

注意:反码在进行正数与负数之间的运算所得的值会相差1

由于反码在进行正数与负数之间的运算所得的差值会相差1,为了解决这个问题,补码就出现了。

10 转成补码   --> 0000 0000 0000 0000 0000 0000 0000 1010
-1 转成补码   --> 1111 1111 1111 1111 1111 1111 1111 1111
两者补码相加 --> 1 0000 0000 0000 0000 0000 0000 0000 1001	
// 左侧超出的部分会被自动去掉,该原码转成十进制为 9
// 随笔练习
console.log((0.1).toString(2)) // 0.0001100110011001100110011001100110011001100110011001101
console.log((0.2).toString(2)) // 0.001100110011001100110011001100110011001100110011001101
console.log((0.3).toString(2)) // 0.010011001100110011001100110011001100110011001100110011
console.log(0.1+0.2 === 0.3) // false

console.log(0.2+0.2 === 0.4) // true

// 0.1 0.2 0.3 0.4 转换 二进制都是无限循环
console.log((0.5).toString(2))  // 0.1

console.log((0.4).toString(2)) // 0.01100110011001100110011001100110011001100110011001101
console.log(0.4+0.2) // 0.6000000000000001

/*
  负数的补码 + 正数的补码 = 0

  负数              正数
  原码  1 001011    0 001011
  反码  1 110100    1 110101
  补码  1 110101

  4 + (-4) =0

*/

参考链接:
[1]https://blog.csdn.net/crazy_zhangcong/article/details/87968720

学习,留下足迹!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值