0x01 原码
原码(true form)是一种计算机中对数字的二进制定点表示方法。原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1(0有两种表示:+0和-0),其余位表示数值的大小。 ——百度百科
如果我们用8为二进制表示一个数的话
+11的原码:00001011
-11的原码:10001011
1.1 原码不能直接参加运算
在数学上,
1
+
(
−
1
)
=
0
1+(-1)=0
1+(−1)=0。
+1的原码:00000001
-1的原码:10000001
两者原码想加的结果是:00000001+10000001=10000010,转换成十进制为-2,这个结果不用想就是错的。
0x02 反码
反码通常是用来由原码求补码或者由补码求原码的过渡码。根据定义,可以得到机器数的反码的整数和小数中“0”的表示形式各有2种,“+0”和“-0”不一样,以8位机器数为例,整数的“+0”原码为0,0000000,反码为0,0000000;整数的“-0”原码为1,0000000,反码为1,1111111
摘自百度百科
正数的反码与其原码相同;负数的反码是对正数逐位取反,符号位保持为1
+11的反码:00001011
-11的反码:11110100
整数"-0"的原码为10000000,其反码为11111111
0x03 补码
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。
摘自百度百科
3.1 整数补码
正整数的补码是其二进制表示,与原码、补码相同
- +1的原码、反码、补码都是是00000001
负整数的补码是,将其原码除符号位外的所有位取反(即反码)后加1
- -1的原码:10000001
- -1的反码:11111110
- -1的补码:11111111
现在问题来类,用8位二进制表示一个带符号的整数,那么这个整数的取值范围是多少呢?
正整数取值范围是00000001 到 01111111,即1-127。因为有一个首位为符号位,所以不可能出现128
负整数的话,先看一个数-127,
- -127的原码: 11111111
- -127的反码:10000000
- -127的补码:10000001
既然有了-127的补码,那么我们很快就能得到-126的补码是10000010。现在有一个问题,-127减去1得到的补码是10000000,这个到底是谁的补码呢?-0,显然在数学上没有任何意义。
在十进制中-127-1=-128,按照这种逻辑,我们就可以定义
10000000是-128的补码。同时,-128不存在原码和反码!
3.2 模的概念
"模"是指一个计量系统的计数范围。如时钟等。
例如:时钟上的数字标记的数字为0-12-0,即循环一圈。假设当前时针指向10点,而准确时间是6点,调整时间可有以下两种拨发:一种是倒拨4小时,即:10-4=6;另一种是往前拨8小时:10+8=12+6=18,还是六点。
在以12模的系统中,加8和减4效果是一样,因此凡是减4运算,都可以用加8来代替。
对"模"而言,8和4互为补数。以12模的系统中,11和1,10和2,9和3,7和5,6和6都有这个特性。共同的特点是两者相加等于模。
"模"的实质上是计量器产生"溢出"的量,比如,往前拨8个小时,10+8=18,然后18/12=1…6。也就是说加上一个数之后,然后除以模取余,余数与减去一个补数的结果一致。(在这里8的补数是4)