个人对整形数据溢出,以及整形数据存储结构和范围的理解

以下以8位为例。

第一点,首先内存全0表示实际意义的0是确定了,原因可能是为了和bool等其他类型相转换等等。

第二点,二进制内存的+-运算像滚筒一样是连贯的,全0再-1,就变成了全1,全1再+1,就变成了0(不知道从哪借的位),0就和1111 1111连接起来形成滚筒型了。

第三点,对于signed类型,为了正负数大约各一半,以8位为例,就以相邻的0111 1111(最大正数)和1000 0000(最小负数)为分界,正数部分是从0000 0001到0111 1111,而负数部分是从 1000 0000到 1111 1111,除去最高位不看,负数个数比正数个数多1,这是因为0000 0000没有算在正数之列,整形范围-2^(n-1) 到2^(n-1)-1。

第四点,计算机在计算中并没有正负之分,纯粹的二进制运算。 只是在输出的时候判断最高位,如果为0,就正常解析,如果为1,就-1再取反(逆补码的过程)解析,然后前面加上-号输出。

第五点,补码的方式只适合以0111 1111和1000 0000为分界的情形,因为取反刚好是以这个分界线来做对称翻转,又因为对称位置的正数在绝对值上比负数小1,所以取反后得再加1。例如,-120 (1000 1000),对称位置是119(0111 0111),想把-120存入,先用120(0111,1000)取反得1000 0111,再加1得1000 1000。

个人对整形数据溢出,以及整形数据存储结构和范围的理解_第1张图片 个人对整形数据溢出,以及整形数据存储结构和范围的理解_第2张图片

第六点,就算正负数分配不采取各一半的方式,在计算上也是没有错误的,只是不好做正负判断,也不能用逆补码的方式(分界线不一样了)来解析输出负数。

第七点,最高位全程都是参与计算的,只是因为分界线的选择,使其恰好可以用作判断正负。 有一种误区:最高位用来做正负判断,好像给人感觉就是不参与计算一样,这是错误的!!

总之,补码是根据二进制内存的连贯特性,为了得出正确算术结果,而不得不采用的方式(计算机特性确定了,只有用逆补码的方式才能得出现实中的正确结果),而不是先有补码理论,计算机再围绕此理论来设计!

 

你可能感兴趣的:(个人对整形数据溢出,以及整形数据存储结构和范围的理解)