计算机中有符号数的三种表示方法:原码,反码和补码。
原码
- 原码定义
原码(true form)是有符号数最简单的编码方式, 最高位是符号位,剩余位是数值位。数值位就是真值的绝对值。正数符号位为0,负数符号位是1 (0有两种表示: +0, -0)。
举例: 字长为8,8位二进制下,+11的原码是: 0000 1011,-11的原码是: 1000 1011 。 零的两种表示:+0原码是:0000 0000,-0原码是:1000 0000
- 原码优缺点
原码是一种计算机中对数字的二进制定点表示方法。
优点:简单直观
缺点:不能直接参加运算
举例:数学上 1+(-1)=0, 翻译成原码直接相加: 0000 0001 + 1000 0001 = 1000 0010 (-2) 是不对的,就是符号位不能直接参与运算,必须和其他数值位分开,这就增加了硬件的开销和复杂度。
- 表示范围
一个字长为n的机器数能表示的范围(不同数字的个数)是固定的2^n (2ⁿ)个无符号数字, n=8就是2^8=256个。
用来表示有符号数字,因为首位是符号位,实际的数字位是n-1个,计数范围是:-2^(n-1)-1 ~ 2^(n-1)-1, 2^n-1个数。 n=8时为:-127~127, 共255个数
反码
- 反码定义
正数的反码跟原码相同;负数的反码是(相对原码)保持符号位不变,将数值位按位取反。或者也可以这么说,负数的反码是将对应正数(绝对值)的原码全部按位取反获取的。
反码通常是用来由原码求补码或者由补码求原码过程中的过度码。
反码也是数值存储的一种,多应用于系统环境设置,如linux平台目录和文件的默认权限设置umask, 就是利用反码原理,umask是啥?
补码
- 补码定义
正数的补码跟其原码相同;负数的补码是在其反码的基础上在末位加1。
补码是计算机把减法运算转化为加法运算的关键编码。
-
怎么理解补码
-
编码转换
正数的原码,反码,补码均相同,不需要转换。
为什么补码的补码就是原码?
为什么“(补码-1)取反 = (补码取反)+1”