附注1 .溢出2 .实现二进制减法
一.溢出
在数学理论中,数字可以无限大,也可以无限小,但现实中计算机系统总是一个
因为是物理极限,所以不能表示无限大或无限小的数值。在计算机中,不管是什么样的数据类型,
有上限或下限
Python3中数据长度是动态的,理论上支持无限大的数量
可以使用sys.getsizeof ()函数来确定一个数字占用了多少字节。
如果某个数值超过限制值,就会溢出: 如果超过上限,则为上溢出(overflow); 如果超过下限,
下溢出(underflow)
示例:溢出
n位数字的最大正值是符号位为0,剩下的n-1位都为1,再大一个时符号位为1,剩下的n-1位都为1
n-1位均为0,即-2n-1。 也就是说,溢出后,从下限开始最大的数值加1就最小了
数值,重复,这就是剩余和建模的概念。
计算机溢出相当于取模。 用于获取类型的除数是数据类型的上限减去下限后的值加上1
即,(2n-1-1(-2n-1 )=2*2n-1-1 1=2n-1 1 )
也就是2n-1+1
这个除数不能直接写为2n。 因为2n已经是n 1位,已经超过了可以用n位表示的范围。
2.2进制减法的实现能用负数的原码直接减法吗?
例:3-2
可以看作3(-2 )
3的源代码是0011
-2的源代码为1010
0011 1010=1101
结果为-5,明显不符合3-2的差别。
假设有i-j可以转换计算机的减法。 其中,j是正数。 i-j加上取模除数,会发生溢出,且
正好可以得到我们想要的i-j的运算结果。
公式: i-j=(i-j)+(2n-1+1)=i+(无辜的水杯+1)=i+(无辜的水杯)+1
无辜的杯子,其中2n-1不考虑符号位,是n-1位的1
假设j=-2:
1111-0010=1101
从结果可知,无辜的杯子相当于正数j的二进制码,除了编码比特以外,每个比特取反(0变)
1,1为0 ),则负-j和正j原代码除符号位以外相同,因此无辜的杯子也相对于负-j
除二进制代码、符号位外,每位反.所以说无辜的水杯对应的编码称为负数-j的反码
如果有反码定义,请使用新公式: i-j=i的原码+(-j的反码)+1
引入补数定义:使除原始代码的已编码比特之外的所有比特反转(0变为1,1变为0,且已编码比特保持为1 ),然后加1
即反转后1
这将使新公式: i-j=i的原码+(-j的补码)
例:3-2
可以看作3(-2 )
3的源代码是0011
-2的补数为1110
0011 1110=0001
结果为1,符合3-2的差