二进制原码、反码、补码运算及标志位
正整数的原码:这个数的二进制,符号位为0;正整数的原码=补码=反码
例1:+66
66的二进制:1000010,所以+66的原码: 0 1000010 =补码: 0 1000010=反码: 0 1000010
负整数的原码:仍是这个数的二进制,符号位为1;负整数的原码、反码、补码计算:先求原码,再求反码,最后求补码;
原码转换为反码:符号位不变,数值位按位取反;
原码转换为补码:符号位不变,数值位按位取反,末尾在+1;
例2:-66
66的二进制:1000010,所以-66的原码:1 1000010 补码:1 0111101 反码:1 0111110
二、二进制原码、反码、补码的加减运算及标志位
1.补码加减基本公式
加法:
整数 [A]补+[B]补=[A+B]补 (mod 2n+1)
小数 [A]补+[B]补=[A+B]补 (mod 2)jianfa
减法:
整数 [A-B]补=[A]补+[-B]补 (mod 2n+1)
小数 [A-B]补=[A]补+[-B]补 (mod 2)
2.标志位
CF(Carry Flag) : 进为标志位。主要用来反映运算是否产生进位或借位。如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。在8位二进制中,如果计算的结果超过 [0,255] 的范围,就有进位,CF就被置为1,如果结果再 [-128,127] 范围内,就是没有进位CF被置为0。
OF(Overflow Flag) :溢出。用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0。在8位二进制中,如果一个运算的结果最终超过 [-128,127] 无论是大于127还是小于-128就被认为是溢出,OF被置为1,如果结果在 [-128,127] 就认为没溢出OF被置为0。
SF(Sign Flag) :符号标志。用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统中,有符号数采用补码表示法,所以,SF也就反映运算结果的正负号。运算结果为正数时,SF的值为0,否则其值为1。
ZF(Zero Flag) :零标志。用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。
PF(Parity Flag) :奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0。
AF(Auxiliary Carry Flag) :辅助进位标志。在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0:(1)、在字操作时,发生低字节向高字节进位或借位时;(2)、在字节操作时,发生低4位向高4位进位或借位时。
在计算机系统中,数值,一律采用补码表示和存储。
原码和反码,计算机都是不存在的。
补码,其实,它就是一个“代替负数”的正数。
使用补码之后,计算机中就没有负数了,也就没有减法运算了。
那么,计算机只需要一个加法器,就可以走遍天下了。
为什么使用补码?
就是为了简化计算机的硬件。
-----------------------
补码(也就是正数),怎么就能代表负数呢?
其实,道理也很简单。根源就是“计数系统的周期性”。
你看 2 位 10 进制数吧:
25 - 1 = 24
25 + 99 = (一百) 24
进位是 10^2 = 100,这也是 2 位数的计数周期。
这个进位,显然不在 2 位数之中。
如果你只取 2 位数,+99 和-1 的作用,就是相同的。
就是说,只要舍弃了进位,正数,就可以代替负数。
这个正数,就是“负数的补数”。
求补数的公式: 补数 = 负数 + 周期 (10^n)。
n 是补数的位数。
-----------------------
在三角函数中,大家都知道,周期是 2π。
那么:
-π/2 和 +3π/2,这两个角度,也是等效的。
负角度,和正角度,要怎么变换呢?
也是用同样的公式: 正角度 = 负角度 + 周期(2π)。
这种转换公式,在计算机中,也可以使用。
-----------------------
计算机用二进制,计算机大佬就把“补数”改称为“补码”。
本质上,并没有什么变化,也就是为了标新立异吧。
8 位 2 进制是:0000 0000~1111 1111 (十进制 255)。
其计数周期是:2^8 = 256。
此时,-1 就可以用 255 (1111 1111) 代替。
同理,-2 的补码就是 254 (1111 1110)。
。。。
正数,本身就是正数,必须直接参加运算,不许再作任何变换。
所以,正数,根本就没有补数(补码)。
由此,你就可以推出补码定义式:
当 X >= 0, [ X ]补 = X; 零和正数不用变换。
当 X < 0, [ X ]补 = X + 2^n。 n 是补码的位数。
以上就是“求补码的正规做法”,与“原码反码符号位”毫无关系。
-----------------------
用补码计算 5 - 7 = -2。
列竖式如下:
5 = 0000 0101
-7 的补码 = 1111 1001
--相加-----------
得: (1) 1111 1110 = -2 的补码
舍弃进位,只取 8 位,结果就是正确的。
这就说明了,借助于补码,就可以用加法,实现减法运算。
原码和反码,都没有这种功能。
所以,在计算机中,根本就不使用原码和反码。
想要了解补码,还得从小学说起。
大概是在小学二年级吧,就学过进位了。
两位十进制数是:0 ~ 99。
那么有:27 + 99 = (一百) 26
也可以:27 - 1 = 26
如果你忽略进位,依然保持两位数,这两种算法的功能,就是完全相同的。
如果在计算机中舍弃进位:
● 负数,就能用正数(即补码)代替;
● 用加法,也就实现了减法运算。
所谓的补码,就是一个【代替负数的正数】。
补码的来源,就是【舍弃进位】!
----------
两位十进制数,舍弃进位,就是减去一百。
因此,+99、-100,当然就是-1 了。
还有,+98,它就是-2。
·
八位二进制数:0000 0000 ~ 1111 1111。
也就是十进制:0 ~ 255。
如果出现进位:2^8 = 256。
此时,+255 (1111 1111)、再舍弃进位,也就是-1 了。
同理,+254 (1111 1110),也就是-2。
。。。
以上这些正数,就“计算机专家发明的补码”了。
小二的知识点,也能如此装B!
你说可笑不?
而原本就是正数,当然就不用再用别的正数来代替了。
也可以说:零和正数的补码,就是它自己。
----------
补码的来源:就是【舍弃进位】!
所谓的:机器数真值符号位原码反码取反加一,都是忽悠!