什么是原码、反码和补码

文章目录

  • 什么是原码、反码和补码
  • 1、机器数
  • 2、原码
  • 3、反码
  • 4、补码
  • 5、总结

1、机器数

前言

一个数在计算机中的表示形式是二进制的话,这个数其实就叫机器数。

机器数通常是带有符号的(指有正数和负数之分),计算机用最高位存放符号,这个 bit 一般叫做符号位。 正数的符号位为 0, 负数的符号位为 1。比如,十进制中的数 +7 ,计算机字长为8位,转换成二进制就是 0 0 0 0 0 1 1 1(一个 byte 有 8bit,有效的取值范围是 -128 ~ +127)。

如果是 -7 ,就是 1 0 0 0 0 1 1 1 。一个存储的二进制码分原码、反码、补码,下面我们就来介绍一下什么是原码、反码、补码

Notes

计算机底层使用二进制形式的补码来计算和存储数据

2、原码

定义

十进制数据的二进制表现形式就是原码,原码最左边的一个数字就是符号位,0为正,1为负。

例如:56 -> 0 0 1 1 1 0 0 0

左边第一位为符号位,其他位为数据位。

一个 byte 有 8bit,最大值是 0 1 1 1 1 1 1 1 (+127),最小值是 1 1 1 1 1 1 1 1 (-127)

在计算机中之所以使用二进制来表示原码是因为逻辑简单,对于电路来说只有开或者关两种状态,用二进制是在方便不过的了。如果使用的进制是十进制、八进制或者十六进制的话,电路没有办法表示那么多的状态

  • 正数计算

使用原码对正数进行计算不会有任何问题的

例如:5 + 2

 0 0 0 0 0 1 0 1
+        0 0 1 0
-----------------0 0 0 0 0 1 1 1

把这个结果转成十进制刚好就等于 7,完全正确无误

  • 负数计算

但是如果是负数的话,那计算的结果就会大相径庭了

我们拿 -56 这个数字来举例,它的原码是 1 0 1 1 1 0 0 0 ,减一之后,就会变成 1 0 1 1 0 1 1 1 ,这个数转成十进制就是 -55。计算前是 -56,减一之后正确的结果应该是 -57(1 0 1 1 1 0 0 1)才对,居然还越减越大了

 1 0 1 1 1 0 0 0
-              1
-----------------1 0 1 1 0 1 1 1

为了解决原码不能用于计算负数的这种问题,这时候,反码它出现了,作为负数的“计算的救星”。

计算规则是正数的反码不变和原码一致,负数的反码会在原码的基础上,高位的符号位不变,其他位取反( 1 变成 0 , 0 变为 1 )。

3、反码

定义

正数的反码是其本身(等于原码),负数的反码是符号位保持不变,其余位取反。 反码的存在是为了正确计算负数,因为原码不能用于计算负数

十进制数字 原码 反码
+0 0000 0000 0000 0000
-0 1000 0000 1111 1111
-1 1000 0001 1111 1110
-2 1000 0010 1111 1101
-3 1000 0011 1111 1100
-4 1000 0100 1111 1011
-5 1000 0101 1111 1010
-6 1000 0110 1111 1001
-7 1000 0111 1111 1000
  • 负数计算

这时候,我们再来使用反码计算一下 -56 - 1 的结果

-56 的原码是 1 0 1 1 1 0 0 0 ,如果转成反码(符号位不变,其他位取反),

那么它的反码就是 1 1 0 0 0 1 1 1

  1 1 0 0 0 1 1 1-              1
-----------------1 1 0 0 0 1 1 0

-56 -1 = -57,-57 的原码是 1 0 1 1 1 0 0 1,转成反码刚好是 1 1 0 0 0 1 1 0,刚好等于刚才我们算出的值

  • 跨零计算

不过反码也有它的 “ 软肋 ”,如果是负数跨零进行计算的话,计算得出的结果不对

我们拿 -3 + 5 来举例

-3 的原码是 1 0 0 0 0 0 1 1,转成反码的话就是 1 1 1 1 1 1 0 0

 1 1 1 1 1 1 0 0
+        0 1 0 1
-----------------0 0 0 0 0 0 0 1

把计算结果转成十进制就是 126,这结果显然不对。那么我们该怎么计算呢,这时候,作为反码的补充编码 —— 补码就出现了。

4、补码

定义

正数的补码是其本身,负数的补码等于其反码 +1。因为反码不能解决负数跨零(类似于 -6 + 7)的问题,所以补码出现了。

十进制数字 原码 反码 补码
+0 0000 0000 0000 0000 0000 0000
-0 1000 0000 1111 1111 0000 0000
-1 1000 0001 1111 1110 1111 1111
-2 1000 0010 1111 1101 1111 1110
-3 1000 0011 1111 1100 1111 1101
-4 1000 0100 1111 1011 1111 1100
-5 1000 0101 1111 1010 1111 1011
-6 1000 0110 1111 1001 1111 1010
-7 1000 0111 1111 1000 1111 1001
-127 1111 1111 1000 0000 1000 0001
-128 1000 0000
  • 跨零计算

这时候,我们再来使用反码计算一下 -3 + 5 的结果

-3 的原码是 1 0 0 0 0 0 1 1,转成反码的话就是 1 1 1 1 1 1 0 0,再转成补码就是 1 1 1 1 1 1 0 1

 1 1 1 1 1 1 0 1
+        0 1 0 1
----------------- 0 0 0 0 0 0 1 0

把这个数转成十进制刚好等于2,结果正确

5、总结

在计算机当中都是使用补码来进行计算和存储的。补码很好的解决了反码负数不能跨零计算的弊端,并且补码还可以记录一个特殊的值 -128,这个数据在 1 个字节下是没有原码和反码

学习了原码、反码和补码的知识之后,我们就可以了解到,Java 当中所有的基本数据类型。比如整数类型的数据类型,存储的数都是同样的,区别是在于什么地方,假设存储的值都是 10

基本数据类型 字节数 内存中实际存储的值
byte 10 1 0000 1010
short 10 2 0000 0000 0000 1010
int 10 4 0000 0000 0000 0000 0000 0000 0000 1010
long 10 8 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1010

从上表中我们可以得出一个结论,为了凑齐字节数,所占的字节越大,则前面补的零越多。

类型转换原理

  • 隐式类型转换
public class Test {public static void main(String[] args) {// 小的数据类型往大的数据类型进行转换底层就是通过左补零完成的byte a = 10; // 0000 1010int b = a;  // 0000 0000 0000 0000 0000 0000 0000 1010System.out.println(b);}
}
  • 强制类型转换
public class Test {public static void main(String[] args) {int a = 300;         // 0000 0000 0000 0000 0000 0001 0010 1100byte b = (byte) a;       // 0010 1100System.out.println(b);  // 打印出44/*int a = 200;         // 0000 0000 0000 0000 0000 0000 1100 1000byte b = (byte)a;        // 1100 1000System.out.println(b);  // 打印出-56*/}
}

补码的运算也适用于逻辑运算符

运算符 含义 运算规则
& 逻辑与 0为false,1为true,当都为1时才为true
| 逻辑或 0为false,1为true,当有至少一个为1时为true,如果都没有则为false
<< 左移 向左移动,低位补零
>> 右移 向右移动,高位补零,符号位按照原来数字的符号位不变
>>> 无符号右移 向右移动,高位补零

什么是原码、反码和补码相关推荐

  1. java用的原码还是反码_java 原码 反码 和补码

    --------- 原码.补码.反码 计算机是数字电路设备,由复杂的电子元器件组合而成,一个电子元器件在工作时,可以分为两种状态--高电平和低电平,表示数据用高电平表示1,低电平表示0,而多个电子元器 ...

  2. c语言 原码反码和补码

    计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的. 原码 一个数的原码(原始的二进制码)有如下特点: 1.最高位做为符号位,0表示正,为1表示负 2.其它数值部分就是数值本身 ...

  3. 计算机原码 反码 和 补码

    一.机器数和真值 1. 机器数 一个数在计算机中的二进制表示,叫做这个数的机器数.在计算机中最高位为符号位.0代表正数,1代表负数. +1 机器数(8位):0000 0001 -1 机器数(8位):1 ...

  4. 计算机真值范围,计算机的机器数,真值,原码, 反码和补码

    机器数 一.数的符号数值化.实用的数据有正数和负数,由于计算机内部的硬件只能表示两种物理状态(用0和1表示),因此实用数据的正号"+"或负号"-",在机器里就用 ...

  5. 原码反码和补码,一篇就够了,全网最详细解析

    其实对于计算机来说,并不存在原码和反码,计算机存储的二进制数据都是以补码的形式存放的,自然对数据的运算也是直接用补码来运算(计算机中只有加法器没有减法器) 我们都知道正整数(包括0)的补码是它本身,负 ...

  6. 负数的原码反码和补码

    As we all know,正数的三码都一样,注意一下最高位为符号位即可: 负数的原码最高位为1,与真值之间换算方便,但对于做减法的操作却很无力,于是引进了反码和补码:负数的反码为它的正数按位取反, ...

  7. 关于计算机中 原码, 反码, 补码 详解

    本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...

  8. 原码, 反码, 补码, 移码 详解

    本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...

  9. 原码 反码 补码 详解

    一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1.机器数 一个数在计算机中的二进制表示形式,  叫做这个数的机器数.机器数是带符号的,在计算机用一个数的最高位存放 ...

  10. 原码 反码 补码 详解

    本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...

最新文章

  1. 比特币耶稣Roger Ver:BCH是世界上最创新、最实用的加密货币之一
  2. hashcode java_hashCode方法的作用?
  3. 【已解决】wepy中使用分包加载报错
  4. 单播、广播、组播、多播
  5. 逆波兰表达式中缀表达式转换为后缀表达式
  6. Linux驱动如何在不同版本上快速迭代升级
  7. java treemap_Java TreeMap lastEntry()方法与示例
  8. 广东 职称英语计算机,现在评职称英语和计算机都不用考了
  9. 深入理解——亚像素 / sub-pixel、亚像素卷积
  10. 0.8.11版本ffmpeg一天移植将近完成。
  11. 36 如何营造一种活跃的科研气氛/如何培养表达交流能力
  12. pyecharts入门及新冠病毒疫情数据可视化(绘制地理图表)
  13. Linux Commands
  14. 3dmax室内模型导入Unity3d 快速烘焙光照【2020】
  15. java无法找到加载主类是什么意思,在Java程序运行时遇到的“Could not find or load main class(无法找到或者加载主类)”是什么意思?...
  16. 内置单片机的433无线模块高速连传典型运用
  17. 神经网络之输出层设计
  18. 【精益生产】一流工厂的管理制度十原则
  19. 基于STM32F03RCT的多路频率占空比可调PWM输出
  20. 斗鱼直播Android开发二面被刷,跳槽薪资翻倍

热门文章

  1. 石化技术杂志石化技术杂志社石化技术编辑部2022年第10期目录
  2. 蓝牙运动耳机什么牌子的好、运动蓝牙耳机排行榜推荐
  3. 警惕读书无用论,要知道一个人最可怕的就是精神世界的贫瘠和荒凉
  4. SuperMap iDesktop .NET 特性介绍
  5. 《游戏大师Chris Crawford谈互动叙事》一第 1 章 故事叙述
  6. Java中,String类字符串拼接 用concat方法 和直接用“+”连接符拼接的区别
  7. 运动无线耳机推荐,值得入手的六款运动耳机
  8. kylin focal fossa ubuntu20.04安装 cuda cudnn lib
  9. mybatis怎样判断list是否为空
  10. 网易互娱2019/09/19面试