网站首页 > 资源文章 正文
众所周知,数据在计算机中进行存储,是采用了一定的编码的。数据在计算机中可以用原码、反码和补码进行表示。不过在开始介绍原码、反码和补码之前,我需要先介绍两个概念:机器数和真值。
机器数和真值
- 机器数
所谓机器数就是一个数字在计算机中用二进制表示的形式。机器数是带符号位,符号位为最高位,0表示正,1表示负。
例如:+进制数+3,其转换为二进制数后为:0000 0011,而对于十进制数-3,其转换为二进制数后为:1000 0011。这里的0000 0011和1000 0011就是所谓的机器数。
- 真值
所谓真值就是机器数所表示的真正的数值。因为机器数是包含符号位,所以转换后的二进制成为形式值。
例如:1000 0001的形式值为129,但是其真正的数值为-1。所以,计算真值的时候,符号位仅仅用来表示该数值是正还是负,而无需参与数值的计算。
原码、反码和补码的概念
首先,计算机存储一个数是需要遵循一定的规则的,也就是所谓的编码。而原码、反码和补码就是计算机存储数字的不同的编码方式。
- 原码
所谓原码就是不对机器数进行任何的转换。其真值就是符号位加剩余位数计算得出的数。
例如:+1的原码是:0000 0001,-1的原码是1000 0001。
对于原码来说,由于第一位被用作了符号位,因此一个8位的二进制数,其表示范围是[-127,127]。
至于转换规则也很简单,对于正数来说,其转换后得到的二进制数就是其原码。对于负数来说,只需将转换后的二进制数的最高位变为1即可。
- 反码
所谓反码就是,如果该数为正数,则无需进行任何转换,如果该数是负数,则符号位保持不变,其余位取反。
例如:+1的反码是:0000 0001,-1的反码是1111 1110。
对于反码来说,与原码类似,由于首位被用作了符号位,因此表示范围也是[-127,127]。
从上述例子可以看出,若一个数为负数的时候,使用反码表示法无法直接得出该反码所表示的真正的数值,需转换为原码后再进行计算。
反码转换为原码的方式是:符号位保持不变,其余位按位取反。
- 补码
所谓补码就是,如果该数为正数,则无需进行任何转换,如果该数是负数,则符号位保持不变,其余位按位取反后加1,也就是先得到该数的反码后加1。
例如:+1的补码是:0000 0001, -1的补码是:1111 1111。
对于补码来说,虽然最高位也被用作了符号位,但是却可以表示-128,因此其取值范围是:[-128, 127]。
同样的,若一个数为负数,使用补码方式也无法直接得出该补码所表示的真正的数值,也需要转换为原码后再进行计算。
补码转为原码的方式是:先将补码减1后,符号位保持不变,其余位按位取反。
为何要使用反码和补码
通过上面的介绍,大家发现了一个问题,原码是对人最好的一种编码,那么为何还要出现反码和补码呢?
首先,一个数值存入计算机后不仅仅是用来展示,还需要参与各种计算。如果是我们人来计算,则能很容易先将符号位进行隔离,先计算除符号位之外的剩余位后再加入符号位。但是,对于计算机来说,则比较困难。最好的方法是让符号位也参与运算。这样类似1-1的问题就转换为了1+(-1)的问题,也就是将减法转换为了加法。
但是想法是好的,但是现实是残酷的。用原码来进行计算的时候总是无法得出正确的值。
当使用原码进行计算的时候,例如:1 - 1 = 1 + (-1)= (0000 0001) + (1000 0001) = 1000 0010 = -2。
所以为了解决减法计算的问题,出现了反码。
当使用反码进行计算的时候,例如:1 - 1 = 1 + (-1)= (0000 0001) + (1111 1110) = 1111 11111
此时的1111 1111为反码表示形式,转换为原码为1000 0000,也就是-0。
虽然在我们的认知中,+0和-0都是0,但是对计算机而言,用两个二进制数值来表示0则显得有些不太合适。所以,用反码表示数值也并非尽善尽美。
所以为了解决+0和-0的表示问题,出现了补码。
当使用补码进行计算的时候,例如:1 - 1 = 1 + (-1) = (0000 0001) + (1111 1111)= (1)0000 0000 。由于超出了表示位数,本该存在的最高位的1会丢掉,所以得出的结果为:0000 0000。
此时的0000 0000为补码,转换为原码后为0000 0000,其值为0,符合预期结果。
再例如:-1 - 127 = (-1) + (-127)= (1111 1111) + (1000 0001)= (1)1000 0000。同理,最高位1会发生丢失,所以得出的结果为:1000 0000。
此时的1000 0000为补码,恰好可以呀用来表示-128.不过需要强调的是,正因为用补码表示的-128转换后得到原码为-0,所以-128只有补码的表示形式。
自此,关于原码、反码和补码的介绍就已经完毕了,希望大家都能掌握。
猜你喜欢
- 2024-09-08 1.2 计算机内信息的表示与存储(计算机内部信息的表示及存储采用的是)
- 2024-09-08 C++手撕底层:位、字节、原码、反码、补码的深入理解
- 2024-09-08 算法水题练习(二)(算法题模板)
- 2024-09-08 二进制是怎么减法运算的?(二进制是怎么减法运算的原理)
- 2024-09-08 “原码、反码、补码”计算机如何更好的实现算法?
- 2024-09-08 PLC的加、减、乘、除指令有什么用?其实功能十分强大!
- 2024-09-08 【1682023】指令:NEG(088)—— 完成二进制求补的功能指令
- 2024-09-08 C语言-自运算、位运算、取反运算(c语言位运算的运算规则)
- 2024-09-08 软件设计(十三)-原码、反码、补码、移码
- 2024-09-08 原码、反码和补码:深度解析C语言中的二进制表示
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- 电脑显示器花屏 (79)
- 403 forbidden (65)
- linux怎么查看系统版本 (54)
- 补码运算 (63)
- 缓存服务器 (61)
- 定时重启 (59)
- plsql developer (73)
- 对话框打开时命令无法执行 (61)
- excel数据透视表 (72)
- oracle认证 (56)
- 网页不能复制 (84)
- photoshop外挂滤镜 (58)
- 网页无法复制粘贴 (55)
- vmware workstation 7 1 3 (78)
- jdk 64位下载 (65)
- phpstudy 2013 (66)
- 卡通形象生成 (55)
- psd模板免费下载 (67)
- shift (58)
- localhost打不开 (58)
- 检测代理服务器设置 (55)
- frequency (66)
- indesign教程 (55)
- 运行命令大全 (61)
- ping exe (64)
本文暂时没有评论,来添加一个吧(●'◡'●)