代码之外--整型数据那点事

来源:互联网 发布:淘宝达人v任务 编辑:程序博客网 时间:2024/04/29 18:07

说到整型,在我们心目中想起的大概只有int,short( int),long( int),long long和signed、unsigned这几个名词吧,然而,为什么会“溢出”,又为什么正值和负值会不对称呢,对unsigned整型输入负数又会导致什么呢,在C++Primer Plus中,采取了一个圆环来表示这样的结构,恐怕还是比较难以理解,那就来深入看一下二进制码内部的结构把。

数在计算机中是以二进制形式表示的

正负以最前面一个数作为符号位,0为正,1为负,人们开发了三种显示的方法,原码、反码、补码,都是有符号定点数的表示方法。
以一个字节为例,原码(除去符号位)就是这个数本身的二进制形式。
例如
0000001 就是+1
1000001 就是-1
正数的反码和补码都是和原码相同。
负数的反码是将其原码除符号位之外的各位求反(1变0,0变1)
[-3]反=[10000011]反=11111100
负数的补码是将其原码除符号位之外的各位求反之后在末位再加1。
[-3]补=[10000011]补=11111101

那为什么要设立补码机制呢

其一,在原码取补后,拥有a补-b补=a补+(-b)补的性质,这使得我们的计算机只需要装有加法运算器就可以进行加减运算了

其二,这解决了正负0和溢出的问题

对于补码而言,如果+1之后有进位的,要一直往前进位,包括符号位!这么说可能不太直观,我们来看一个例子
[10000000]补
=[10000000]反+1
=11111111+1
=(1)00000000
=00000000(最高位溢出了,符号位变成了0)
然后,规定10000000为-128(在原码中是-0,也是为什么负数比正数多一个的原因),这时候,溢出就变得很好理解了,对127(补码为01111111)再加1,由于进位就变为10000000了,没错,当溢出一次时,就丢了一个2的最高位数次方大小的值,可以理解为计算机给他的内存从右到左写入的时候没位置了,直接扔掉了!
示意图

最后的一点,对signed整型输入负值会发生什么?

其实计算机会把原码丢到实现转换完,错以为是真-unsigned,结果,你的unsigned整型就会变得极端大——你的好好的二进制最高位变成了1!
logichack原创,随便写写,随意转载。

0 0
原创粉丝点击