什么是原码、反码和补码
什么是原码、反码和补码
文章目录
- 什么是原码、反码和补码
- 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 |
<< | 左移 | 向左移动,低位补零 |
>> | 右移 | 向右移动,高位补零,符号位按照原来数字的符号位不变 |
>>> | 无符号右移 | 向右移动,高位补零 |
什么是原码、反码和补码相关推荐
- java用的原码还是反码_java 原码 反码 和补码
--------- 原码.补码.反码 计算机是数字电路设备,由复杂的电子元器件组合而成,一个电子元器件在工作时,可以分为两种状态--高电平和低电平,表示数据用高电平表示1,低电平表示0,而多个电子元器 ...
- c语言 原码反码和补码
计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的. 原码 一个数的原码(原始的二进制码)有如下特点: 1.最高位做为符号位,0表示正,为1表示负 2.其它数值部分就是数值本身 ...
- 计算机原码 反码 和 补码
一.机器数和真值 1. 机器数 一个数在计算机中的二进制表示,叫做这个数的机器数.在计算机中最高位为符号位.0代表正数,1代表负数. +1 机器数(8位):0000 0001 -1 机器数(8位):1 ...
- 计算机真值范围,计算机的机器数,真值,原码, 反码和补码
机器数 一.数的符号数值化.实用的数据有正数和负数,由于计算机内部的硬件只能表示两种物理状态(用0和1表示),因此实用数据的正号"+"或负号"-",在机器里就用 ...
- 原码反码和补码,一篇就够了,全网最详细解析
其实对于计算机来说,并不存在原码和反码,计算机存储的二进制数据都是以补码的形式存放的,自然对数据的运算也是直接用补码来运算(计算机中只有加法器没有减法器) 我们都知道正整数(包括0)的补码是它本身,负 ...
- 负数的原码反码和补码
As we all know,正数的三码都一样,注意一下最高位为符号位即可: 负数的原码最高位为1,与真值之间换算方便,但对于做减法的操作却很无力,于是引进了反码和补码:负数的反码为它的正数按位取反, ...
- 关于计算机中 原码, 反码, 补码 详解
本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...
- 原码, 反码, 补码, 移码 详解
本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...
- 原码 反码 补码 详解
一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1.机器数 一个数在计算机中的二进制表示形式, 叫做这个数的机器数.机器数是带符号的,在计算机用一个数的最高位存放 ...
- 原码 反码 补码 详解
本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...
最新文章
- 比特币耶稣Roger Ver:BCH是世界上最创新、最实用的加密货币之一
- hashcode java_hashCode方法的作用?
- 【已解决】wepy中使用分包加载报错
- 单播、广播、组播、多播
- 逆波兰表达式中缀表达式转换为后缀表达式
- Linux驱动如何在不同版本上快速迭代升级
- java treemap_Java TreeMap lastEntry()方法与示例
- 广东 职称英语计算机,现在评职称英语和计算机都不用考了
- 深入理解——亚像素 / sub-pixel、亚像素卷积
- 0.8.11版本ffmpeg一天移植将近完成。
- 36 如何营造一种活跃的科研气氛/如何培养表达交流能力
- pyecharts入门及新冠病毒疫情数据可视化(绘制地理图表)
- Linux Commands
- 3dmax室内模型导入Unity3d 快速烘焙光照【2020】
- java无法找到加载主类是什么意思,在Java程序运行时遇到的“Could not find or load main class(无法找到或者加载主类)”是什么意思?...
- 内置单片机的433无线模块高速连传典型运用
- 神经网络之输出层设计
- 【精益生产】一流工厂的管理制度十原则
- 基于STM32F03RCT的多路频率占空比可调PWM输出
- 斗鱼直播Android开发二面被刷,跳槽薪资翻倍
热门文章
- 石化技术杂志石化技术杂志社石化技术编辑部2022年第10期目录
- 蓝牙运动耳机什么牌子的好、运动蓝牙耳机排行榜推荐
- 警惕读书无用论,要知道一个人最可怕的就是精神世界的贫瘠和荒凉
- SuperMap iDesktop .NET 特性介绍
- 《游戏大师Chris Crawford谈互动叙事》一第 1 章 故事叙述
- Java中,String类字符串拼接 用concat方法 和直接用“+”连接符拼接的区别
- 运动无线耳机推荐,值得入手的六款运动耳机
- kylin focal fossa ubuntu20.04安装 cuda cudnn lib
- mybatis怎样判断list是否为空
- 网易互娱2019/09/19面试