机器数、真值、原码、反码、补码
机器数
机器数是数字在计算机中的二进制表示形式。机器数有2个特点:一是符号数字化,二是其数的大小受机器字长的限制。
机器数可以是带符号的,也可以是不带符号的。带符号的机器数用来表示正数、负数和零,而不带符号的机器数只能表示非负整数。在计算机中,通常使用有符号的机器数来进行算术运算和表示数据。但是,在某些情况下,无符号的机器数也会被使用,例如在位运算和处理二进制数据时。
在计算机用机器数的最高位存放符号,正数为0,负数为1。比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是0000 0011。如果是 -3 ,就是 100 00011 。那么,这里的 0000 0011 和 1000 0011 就是机器数。
原码、反码、补码都属于机器数的形式
真值
机器数的真值是指它所代表的实际数值。对于无符号的机器数,其真值就是它本身;而对于有符号的机器数,其真值需要根据其表示方式进行计算。
例如有符号数 1000 0011,其最高位1代表负,其真正数值是 -3
原码
用第一位表示符号,其余位表示值。因为第一位是符号位,所以8位二进制数的取值范围就是:[1111_1111 , 0111_1111] 即 [-127 , 127] ,原码是容易被人脑所理解的表达方式。
8位二进制数的取值范围是从00000000(0)到11111111(255),其中最高位为符号位,表示正负。如果使用补码表示法,则取值范围为从10000000(-128)到01111111(+127)。
平时所说的8位有符号二进制数的取值范围是从10000000(-128)到01111111(+127),其中最高位为符号位,表示正负。这个范围是根据补码表示法计算得出的。
反码
正数的反码是其本身,负数的反码是符号位保持不变,其余位取反。
例如正数1的原码是[0000_0001],它的反码是是其本身[0000_0001],
-1的原码是[1000_0001],其反码是[1111_1110]
补码
正数的补码是其本身,负数的补码是在其反码的基础上+1,
例如正数1的原码是[0000_0001],他的补码是其本身[0000_0001],
-1的补码是[1111_1111]
在八位二进制下,-128不能用原码或反码表示,原码、反码只能表示0到127,-0到-127;补码没有正0与负0之分,[-0]反码的第一个1是符号位,尾数中的7个1是数值位,尾数加一后,数值位产生了进位,1111 1111+1=1 0000 0000(计算补码的过程中,并不是先保证第一位不变,而是保证符号位不变,保证补码规则是反码整体加一)。所以,补码能表示的数的个数中,比原码反码少了一个,所以补码可以多表示一个真值为-128的数。
十进制 | 原码 | 反码 | 补码 |
---|---|---|---|
-128 | 1000 0000(超过范围,进位被舍去) | 1111 1111(原码超过范围) | 1000 0000(±0补码相同,负数可以多表示1个值) |
-127 | 1111 1111 | 1000 0000 | 1000 0001 |
… | … | … | … |
-2 | 1000 0010 | 1111 1101 | 1111 1110 |
-1 | 1000 0001 | 1111 1110 | 1111 1111 |
-0 | 1000 0000 | 1111 1111 | 0000 0000 |
+0 | 0000 0000 | 0000 0000 | 0000 0000 |
1 | 0000 0001 | 0000 0001 | 0000 0001 |
2 | 0000 0010 | 0000 0010 | 0000 0010 |
… | … | … | … |
126 | 0111 1110 | 0111 1110 | 0111 1110 |
127 | 0111 1111 | 0111 1111 | 0111 1111 |
其中,正数的源码、反码和补码都相同,而负数的反码是将其源码中所有位取反(0 变成 1,1 变成 0),补码是在反码的基础上加 1。注意到对于有符号整数,最高位为符号位,0 表示正数,1 表示负数。因此,0 的二进制补码是 00000000,而不是 10000000。
n位有符号数二进制补码的取值范围为-2^(n-1) 到 2^(n-1)-1
在计算机中,对于有符号数的加减法运算,都是通过补码进行的。
-128的由来 :最高位为符号位,所以剩下7位代表0-127 ,所以能从-127表示到127,由于+0和-0都表示0,重复了,所以多出一个位子表示负数。对于一个8位的补码表示法,最大值为01111111(+127),最小值为10000000(-128),而没有-0这个值。
在一些特定的应用场景中,可能会将10000000解释为-0,但这不是补码的标准定义。在实际编程中,应该避免使用-0这种非标准的表示方法,以免引起混淆和错误。
有了原码为什么要使用反码和补码
因为人脑可以知道第一位是符号位,可以根据符号位对真值的绝对值进行加减乘除,但是对于计算机来说,加减乘除是最最最基本的运算,要设计的尽量简单,计算机辨别符号位会让计算机的设计电路变得很复杂,于是人们想出了让符号位也参与到运算上来。减去一个数,等于加上他的负数。
使用原码参数运算的缺陷
从上面的原码表中可以看见左边每增加一个二进制单位对应的真数是递减的,而右边每增加一个二进制单位对应的真数是递增的,所以对于原码来说,能满足正数的加法,但无法满足负数的加法
2+1 = [0000_0010]原+[0000_0001]原=[0000_0011]原 = 3
1+(-1)=[0000_00001]原+[1000_0001]原=[1000_0010]原=-2
为了满足负数对加法的需求,就必须让负数与他对应的二进制码是同步递增或者同步递减
于是就通过符号位不变,其余位取反来满足这个同步递增或者递减的要求,由于正数本来就满足它本身的加法,所以不需要做任何改变。这就是反码的定义由来。
从上图的反码表中可以看到在运算不跨过0的时候,正负数的加法已经能满足要求
-2+1=[1111_1101]反+[0000_0001]反=[1111_1110]反=-1
127+1=[1000_0000]反=-127=128 加法算出来是128,由于128超过最大值,余1,所以取最小值开始的第一位,也就是
最小值-127,但是这里有个不合理的地方,就是[1111_1111]和[0000_0000]都表示0,这导致在实际计算中每当跨过0一次,就有一个单位的误差
-1+2=[1111_1110]反+[0000_0010]反=[0000_0000]反=0
要解决这个问题就必须让反码中的[1111_1111]和[0000_0000]合并,
由于[1111_1111]+[0000_0001]=[0000_0000],所以在负数反码的基础上+1就可以解决反码中跨0的误差问题,同时不会对负数与它对应的二进制反码的同步递增产生影响,所以在反码的基础上+1就完美的解决了符号参与预算的问题,这就是补码为什么是在负数反码的基础上+1的由来。
从上面的图中发现还有一个[1000_0000]的二进制没有对应任何真数,于是就规定了这个数的真数是-128
所以补码的表示范围是[-128~127] ,这样一来256个二进制正好表示256个整数,在实际二进制的运算中超过范围其实就是对256的取余运算(x+128)mod 256 - 128。
机器数、真值、原码、反码、补码相关推荐
- [例题详解]真值 机器数概念 | 原码 反码 补码 移码 概念及加减计算
目录 真值和机器数 原码 反码 补码 移码 对比记忆 | 原 反 补 移码 加减法 | 原码 补码 结语 | 大学生学习复习资料 真值和机器数 真值:-5.+10 机器数(带符号数)(= 符号位 [0 ...
- 真值、机器数、原码、补码、反码详解(你想知道的全都有!)
计算机组成原理中的数值表示法 真值 机器数 原码 反码 补码 真值 在日常的书写习惯中,往往用正.负号加绝对值表示数值,用这种形式表示的数值为真值. 简单来说 真值 就是我们平时用的数本身 机器数 在 ...
- 二进制 真值 原码 反码 补码
机器数: 一个数在计算机中二进制的表示形式叫机器数,机器数是带符号的 .计算机使用最高位来表示符号位 负数为1 正数为0.假如计算机的字长为8位 那么对于十进制3的机器数表示为0000 0011 , ...
- 真值 原码 反码 补码
计算机中只能做加法运算,它的减法是通过加法来实现的 原码,反码,补码的产生过程,就是为了解决计算机做减法和引入符号位的问题 真值 正数或负数的真值 → 为其绝对值对应的二进制数前面加上正号或负号 例如 ...
- 原码 反码 补码的简单计算附例题
原码 反码 补码 对计算机中常见数据简单分类 机器数 与 真值 原码 反码 补码 扩展 对计算机常见数据的分类 机器数 就是数值在计算机中的二进制表现形式 机器数在计算机中有符号,使用 最高位表示符号 ...
- c语言原码 补码 反码,C语言 原码--反码--补码
//原码,反码,补码 #include #include //数值的表示方法--原码.反码和补码 //原码:最高位为符号位,其余各位为数值本身的绝对值 //反码: //正数:反码与原码相同 //负数: ...
- 关于计算机中 原码, 反码, 补码 详解
本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...
- 原码, 反码, 补码, 移码 详解
本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...
- 原码 反码 补码 详解
一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1.机器数 一个数在计算机中的二进制表示形式, 叫做这个数的机器数.机器数是带符号的,在计算机用一个数的最高位存放 ...
- 原码 反码 补码 详解
本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...
最新文章
- 解密 Redis 助力双 11 背后电商秒杀系统
- AAuto如何设置combobox
- 加锁查询 FOR UPDATE 解决表格查询极慢的问题
- elasticsearch安装过程中的license问题解决办法
- C# Image 、 byte[] 、Bitmap之间的转化
- [SpringSecurity]web权限方案_用户授权_注解使用
- mysql文献综述_文献综述随笔(二十)
- Java中获取系统日期时间/系统时间
- js中select下拉框重置_如何利用CSS3制作炫酷的下拉框
- 剑与轮回找回服务器,剑与轮回自由之都1服开服时间表_剑与轮回新区开服预告_第一手游网手游开服表...
- 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) ...ubuntu 18.04 安装vim遇到的错误...
- java cpu_JAVA定位CPU占用率高
- maven中使用MySQL
- 《计算机导论》学后感想,学习《计算机导论》后的感想.doc
- 工厂设备状态监控可视化解决方案
- Docker端口映射不起作用的解决办法
- 为Web登陆添加验证码功能
- 最全app上传渠道入口 拿去即用
- python加mysql加界面用代码写_python加mysql_python操作mysql
- 软件测试的各种技术你知道吗?
热门文章
- verilog设置24进制计数器_通用计数器的功能简介
- ❤️小程序入门基础(二)❤️(个人学习笔记)
- 安全漏洞漫谈 【http://luoluo.cnblogs.com/】
- 质数的后代 --水题
- LOVIN' YOU 蜜妮莱普顿(Minnie Riperton)
- python爬虫实战——轻松学会电脑桌面壁纸爬取
- java jsch 返回值_java-springboot使用JSch远程
- 【CSDN竞赛第四期】参赛体验(第四期徽章什么时候发呀
- FontIcon -- Web开发的新选择
- R语言实战(第三版)学习笔记-第一章