什么是原码、反码和补码

这篇具有很好参考价值的文章主要介绍了什么是原码、反码和补码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么是原码、反码和补码

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 (-128)

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

  • 正数计算

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

例如: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 

什么是原码、反码和补码

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

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 1010
        int b = a;	 // 0000 0000 0000 0000 0000 0000 0000 1010
        System.out.println(b);
    }
}
  • 强制类型转换
public class Test {
	public static void main(String[] args) {
    	int a = 300;	   		// 0000 0000 0000 0000 0000 0001 0010 1100
        byte b = (byte) a; 		// 0010 1100
        System.out.println(b);	// 打印出44
        /*
        	int a = 200;	  		// 0000 0000 0000 0000 0000 0000 1100 1000
        	byte b = (byte)a; 		// 1100 1000
        	System.out.println(b);	// 打印出-56
        */
    }
}

补码的运算也适用于逻辑运算符文章来源地址https://www.toymoban.com/news/detail-407724.html

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

到了这里,关于什么是原码、反码和补码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++知识精讲13 | 原码、反码和补码

    ------------------------------------------------------------------------------------------------------------------------- 观看视频ing......  12岁的少年编程者告诉你编程如此简单  ------------------------------------------------------------------------------------------------------------------------- ---------------------------------------

    2024年02月16日
    浏览(37)
  • List 3.5 详解原码、反码、补码

    本博客文章已收录至我的Java SE专栏,如需阅读其他有关博客笔记请转至该专栏下 传送门 --Java SE_程序员雨空集 目录  前言 原码 原码的示例 原码的弊端 反码 反码的示例 反码的弊端 补码 补码的示例 补码的小细节 总结 原码:十进制数据的二进制表现形式,最左边是符号位,

    2024年02月08日
    浏览(99)
  • 【007】C++数据类型之原码、补码、反码

    💡 作者简介:专注于C/C++高性能程序设计和开发,理论与代码实践结合,让世界没有难学的技术。包括C/C++、Linux、MySQL、Redis、TCP/IP、协程、网络编程等。 👉 🎖️ CSDN实力新星,社区专家博主 👉 🔔 专栏介绍:从零到c++精通的学习之路。内容包括C++基础编程、中级编程、

    2024年02月05日
    浏览(32)
  • Java基础:进制之间的转换,8421码,原码,反码,补码

    1平时的数一般都是用十进制表示的 十进制: 12345=10000+2000+300+40+5 =1*10^4+2*10^3+3*10^2+4*10^1+5*10^0 =1*10000+2*1000+3*100+4*10+5*1 =10000+2000+300+40+5 =12345 十进制转换为其他进制: 整数除以要转换目标进制的基数,一直除完为止,再将它们的余数由下对上排列。 二进制由0,1组成,0b开头 八进

    2023年04月08日
    浏览(43)
  • verilog学习笔记5——进制和码制、原码/反码/补码

    2023.8.13 天气晴 整数:除以2,余数倒着写 小数:乘以2,正着写 例题1 : 例题2 : 十进制数13.613转化为二进制数,要求误差小于1% 乘以2的次方 乘法 :被乘数左移,后相加 除法 :除数右移,被除数/余数去减去除数 8位二进制数的范围: 有符号数 无符号数 -128~127 0~255 原码 反

    2024年02月13日
    浏览(44)
  • 位运算(按位与、按位或、异或、取反)以及原码、反码、补码

    目录 位运算 按位与运算符 [ ] 按位或运算符 [ | ] 异或运算符 [ ^ ] 取反运算符 [ ~ ] 移位操作 一些面试常考的位操作运算 获取二进制中最右边的1 计算机原码、反码、补码 机器数 “三码”之间的转换 计算机中为啥要用补码呢? 真数 原码 反码 补码 有了原码为什么要使用反码

    2024年02月02日
    浏览(50)
  • 【C语言】中的位操作符和移位操作符,原码反码补码以及进制之间的转换

    欢迎大家来到c语言知识小课堂,今天的知识点是操作符和进制 同样都是数字1111,不同进制下数字的大小不同,第二行代表的是其各位数字十进制下的大小,将各位数字的十进制大小相加即1111在这个进制下转化为十进制的大小,从图中我们可以看出来 进制的定义:从右往左

    2024年02月22日
    浏览(52)
  • 爱上C语言:整型和浮点型在内存中的存储(进制转换,原码,反码,补码以及大小端)

    🚀 作者:阿辉不一般 🚀 你说呢: 生活本来沉闷,但跑起来就有风 🚀 专栏:爱上C语言 🚀 作图工具:draw.io ( 免费开源的作图网站) 如果觉得文章对你有帮助的话,还请点赞,关注,收藏支持博主,如有不足还请指点,博主及时改正,感谢大家支持!!! 大家好啊😉!今

    2024年02月05日
    浏览(55)
  • 关于二进制的原码、补码和反码,以及表示范围、常见位运算符和进制转换的理解与简述

    【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://www.cnblogs.com/cnb-yuchen/p/17963363 出自【进步*于辰的博客】 参考笔记一,P3.13、P5.1;笔记三,P43.1/3、P44.1。 注:我暂且没有整理关于二进制、原码、补码和反码等概念的理论,本文中的阐述都基于

    2024年02月02日
    浏览(46)
  • ⚡【C语言趣味教程】(2) 整数类型:数据类型的概念 | 原码反码与补码 | 有符号型和无符类型 | 研究 signed char 与 unsigned char 的取值范围

      🔗 《C语言趣味教程》👈  猛戳订阅!!! 在讲解数据类型前,我们不得不先讲解一些必备的知识点,比如如何定义一个变量,数据类型的基本概念。并介绍 ASCII 码,为 char 类型的讲解做必要的铺垫。然后讲解原码反码和补码,讲解 IEEE754标准时需要这部分的知识作为基

    2024年02月16日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包