关于原码,补码的笔记
一,原码
原码表示法规定:用符号位和数值表示带符号数,正数的符号位用 “0” 表示,负数的符号位用 “1” 表示,数值部分用二进制形式表示。
如:
在八位编码下,原码 取值从 -2^7+1~+2^7-1
x[原] = 0111 1111 x= 2^7-1
x[原] = 0000 0000 x=+0
x[原] = 1000 0000 x=-0
x[原] = 1111 1111 x=-2^7+1
原码的缺陷:1,因为有着正0 和 负0,所以 原码只能表示 2^8-1 个数。
2,正负原码无法直接相加,在计算机内部计算麻烦。因为要把符号位和数值位分开计算。
如 2+(-1)= 1,但 00000010 +10000001=10000011 其真值为 -3
因为原码有着这样的缺陷,所以在计算机内部,更常用的数值表示方法是补码。
二,补码
补码表示法规定:正数的补码与原码相同,负数的补码为对该数的原码除符号位外各位取反,然后再加一
如: 在八位编码下,补码 取值从 -2^7~+2^7-1
设真值 x=1,y=--2
则 [x]原=0000 0001 [x]补=0000 0001
[y]原=1000 0010 [y]补=1111 1110
另外:补码中 +0 和 -0 的补码是相同的。设 a = +0,b = -0
由于 a 是正数,所以补码与原码相同,所以
[a]补 = 0000 0000
而 [b]原=1000 0000 本来 [b]补= 1 0000 0000 ,
但由于计算机的定长,进位的话就被截掉了,所以 1 被截掉了,于是
[b]补 = 0000 0000
这样 +0 和 -0 就统一了。
发现:由于 +0 和 -0 共用相同的补码,所以相对原码来说,就多了一个不用的补码:
[n]补 = 1000 0000
于是规定 [-128]补 = 1000 0000
三,比较
在计算机中 正数表示形式 都是一样的 但 负数 却有三种表示方法:原码,反码,补码
三码之间的比较:
其中 原码表示形式简单,适于乘除运算 ,
但其加减运算就比较复杂了,因为要区分正负号 与数值部分,较为麻烦。
于是为了解决减法,引入了 反码和补码,
反码和补码 其减法可以用加法实现,且数的符号位可以和数值一样参与运算。
至于说反码和补码有什么区别的话, 可以将补码认为是反码的优化版。
其实 反码和补码 就差在那个 末位加一上。
这一加 1,不仅统一了反码 +0 和 -0 的问题,
还扩大的反码数值表示范围 (其实也就多加了一个数)
========== ========= ======== ======= ====== ===== ==== === == =
春宵 宋 苏轼
春宵一刻值千金,花有清香月有阴。
歌管楼台声细细,秋千院落夜沉沉。