浅谈原码 反码 补码
来源:互联网 发布:ugg和jumbougg知乎 编辑:程序博客网 时间:2024/06/08 08:44
在了解原码、反码、补码之前,我们首先需要知道的是什么是机器数?什么是真值?
机器数:机器数(computer number)是将符号”数字化”的数,是数字在计算机中的二进制表示形式。机器数有2个特点:一是符号数字化,二是其数的大小受机器字长的限制。
真值:真值是一个变量本身所具有的真实值,它是一个理想的概念,一般是无法得到的。所以在计算误差时,一般用约定真值或相对真值来代替。
1.原码
原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。
[+1]原 = 0000 0001
[-1]原 = 1000 0001
2.反码
反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。
取反操作:0变1,1变0
[+1]原 = [0000 0001]原 = [0000 00001]反
[-1]反 = [1000 0001]原 = [1111 1110]反
正数的原码为其本身;负数的反码是在其原码的基础上,符号位不变,其余各位取反;
3.补码
[+1]原 = [0000 0001]原 = [0000 00001]反 = [0000 0001]补
[-1]反 = [1000 0001]原 = [1111 1110]反 = [1111 1111]补
正数的补码为其本身;负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+1(也可理解为:负数的补码是在其反码的基础上+1);
根据以上的分析,我们可以知道,正数的原码、反码、补码三种编码方式都是相同的,即:
[+1]原 = [0000 0001]原 = [0000 00001]反 = [0000 0001]补
因此,我们主要需要探讨的还是负数的编码方式,现在我们可以看一个减法的小例子:
计算十进制的表达式:1 - 1 = 0
我们可以试着用原码进行计算,即:
1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [1000 0010]原 = -2
为什么会出现这样的结果呢?我们可以思考一下,如果用原码表示减法运算,并且让符号位也参与运算,显然结果是不正确的。
我们试着用反码进行计算,即:
1 - 1 = 1 + (-1) = [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0
根据上面的计算结果,我们可以知道,真值的部分其真值部分是正确的,但是“0”确是有歧义的,我们平时理解的+0和-0是一样的,但是用原码却是[0000 0000]原和[1000 0000]原两种编码方式表示0。
既然出现了问题,我们可以先思考一下为什么会出现这样的问题呢?其次,我们可以在试试用补码表示,即:
1 - 1 = 1 + (-1) = [0000 0001]补 + [1111 1111]补 = [1111 1110]补 = [0000 0000]补 = [0000 0000]补 = 0
现在,我们可以看到,前面-0的问题不存在了吧。
根据以上的分析可知:为什么会出现原码、反码和补码,而不仅仅是只有原码了吧。
既然已经说到这块了,那后面再说一点点和它相关的内容。
为什么8位二进制表示原码的范围是[-127,+127],但表示补码的范围却是[-128,+127]吗?
下面我们可以看一个小例子就可以很好的解释这一问题了:
(-1) + (-127) = [1111 1111]补 + [1000 0001]补 = [1000 0000]补
在补码的运算结果中,[1000 0000]补的值为-128,但是在实际中,使用以前-0的补码来表示-128,所以-128并没有原码和反码表示。(根据上面的计算方法,我们可以得出-128的补码表示[1000 0000]补算出来的原码为[0000 0000] ,切记:这是不正确的,错的,不对的!!!)
- 浅谈原码 反码 补码
- 浅谈 -128的原码 反码 补码
- 浅 浅谈原码、补码和反码
- 原码、反码、补码
- 原码-反码-补码
- 原码、反码、补码
- 原码、反码、补码
- 原码,反码,补码
- 原码、反码、补码
- 原码、反码、补码
- 原码、反码、补码
- 原码、反码、补码
- 原码、反码、补码
- 原码、反码、补码
- 原码补码反码
- 原码、反码、补码
- 原码、反码、补码
- 原码、反码、补码
- Exchange“我们当前无法获取该信息”错误解决
- 49. Group Anagrams [Leetcode]
- 《Effective JavaScript》读书笔记——Item1: 明确你所使用的javascript版本
- 动态规划-最长公共子序列
- ES6学习资料整理
- 浅谈原码 反码 补码
- 对话框在flash底下的解决方法
- Spark Streaming Backpressure分析
- 计蒜之道复赛 腾讯消消乐
- Linux学习笔记:bash的基础特性
- Mac终端用sublime(1,2,3)打开文件完整版教程
- GHGL项目总结-Oracle
- memset函数使用详解
- java内部类