什么是机器数
顾名思义 机器数就是能被计算机识别的二进制形式的数 我们建设计算机的字长为8(就是存储一个字的长度) 十进制3转换二级制的数等于0000 0011 如果是-3 二进制表现形式是1000 0011 最高位是符号位 1代表负数 0代表正数
原码 补码 反码
原码 最高位是符号位 其他数字的绝对值代表本数值 反码 正数的反码依旧是原码 负数的反码是将正数原码各位取反(符号位不变) 补码 正数的补码依旧是其原码 负数的补码是在反码的基础上 1
为什么要使用三种编码表示二进制数
首先明确 正数不管是通过 原码 反码还是补码所表示的结果都一样 但是对于负数 原码要经过取反变成反码 最后在反码的基础上 1变成补码。在刚开始接触进制的时候,我有一个疑惑,为什么不可以用原码编码直接表示二进制,1用00000001表示 -1用10000001表示 1 (-1)=0 可是我们经过原码计算结果是错误的 结果是-2 为了解决原码计算减法的错误 出现了反码 使用反码编码计算 1 (-1)可以得出真值的正确结果 -0 这也是我们所不能接受的结果 于是乎补码的出现解决了 上面的问题
补码的实现原理
用大佬经常讲解使用的钟表比较好理解 假设钟表的字长是一位 进制为十二进制表示 比如下午两点 我们可以写作 14 12 14 12-10 都表示的是下午两点 这里涉及的数学的一个同余概念 就是有两个数a,b 除以一个整数如果余数相等 则称这a,b同余 比如 14 26 2在表盘上表现的形式都是一样的 可以实现化简为加,本质是舍去溢出的部分而不改变结果 补码的实质就是 比如计算-3 找一个可以替代-3的正数253 用253参与计算 进行加法运算后,将得到的结果中溢出的数字舍去后,只读取结果中固定位数(此处是 8 位)的二进制数作为运算的结果。
无符号二进制数
八位二进制数可以表示256个数字 范围是0-255 在计算机读取时,只会读取低八位的二进制数 超过256这个范围 溢出部分会被自动舍去 所以 00000001 和10000001 在补码编码下在计算机看来是一样的都是1
有符号二进制数
有符号二进制数的范围是[-127,128] 通过补码可以实现有符号二进制运算适用无符号二进制运算规则 首先解决了两个0的问题 10000000表示的是-128 其次解决了原码减法运算的错误
补码的计算方法
1.原码 经过取反 得到反码 再 1 变成补码(正数的补码是其本身) 2.负数X Mod = Sum 比如-3的补码在八位字长计算机中的计算方法 -3 256=253 253的二进制1111 1101 因此-3的补码是11111101