TA的每日心情 | 慵懒 2018-5-27 17:09 |
---|
签到天数: 113 天 [LV.6]常住居民II
高级会员
- 积分
- 1009
|
溢出,其实并不神秘!(以下阐述若有错误或不足之处,请勿喷我)
所谓溢出,就是在计算机中,当要表示的数据超出计算机所使用的数据的表示范围。
例如,计算机中只能表示0-9的数值范围,但是经过N次运算,导致运算中或结果出现超出范围的数值10,那么这个数值就溢出了(这里只是简单的类比,让大家理解溢出的概念,计算机中没有这么简单)。
要讨论溢出,首先要明白数值在计算机中是如何表示的!
——计算机中的机器数以0和1组合的二进制代表数值。
——机器数(整数)分为有符号数和无符号数。
——一个有符号数有原码(与真值相同)、反码(数值位按位取反,符号位不变)和补码(补码=反码+1,原码=补码的反码+1)三种编码方式(当然还有其他的编码方式)。
PS:以上三点最好理解一下。
下面我们需要搞清楚3个问题:
①何为有符号数和无符号数?
有符号数就是最高位表示数值的正负(最高位是0,表示正数,最高位是1,表示负数),
例如,单字节 1001 0100 表示-20 , 单字节 0001 0100 表示+20。
无符号数就是没有表示正负的位,都是数值位。
例如,单字节 1000 0001 表示32769 , 单字节 0000 0001 表示1。
因此,我们在游戏中游戏数值的范围(32位)是
有符号时,00 00 00 00~FF FF FF FF 的数值范围是-2147483648(80 00 00 00)~+2147483647(7F FF FF FF)
无符号时,00 00 00 00~FF FF FF FF 就是 0~4294967295
这个范围就看程序员定义变量时是怎么定义的。
②如何理解补码?
计算机在运算时,是采用真值的补码参与运算的。
必记:补码=反码+1。
例如,真值-20,补码 1001 0100,补码的反码1110 1011,原码=补码的反码+1=1110 1100(这里我为什么先写补码,再写反码,最后写原码?若是你答对了,那么你就理解了上面的内容了)
③补码的溢出运算?
a.同符号数相加才可能溢出。
例如,游戏中我们通过某种操作将获取铜币每次弄成负值:-100和-50(假设合理范围【红色部分】是-128~0~127,便于理解,游戏中肯定不可能是这样的),
那么如何计算我们获取多少正的铜币呢?
-100的补码是1001 1100
-50 的补码是1100 1110
2次相加为 1 0110 1010
这里要理解2个地方:一是这种溢出会舍去超过8位的最高位1;二是符合位是0。
所以得出的结果是+106,也就是获得106铜币,而不是-106.
b.两正数之和的数值部分向符号位进位。
例如,游戏中我们通过某种操作将获取铜币每次弄成负值:89和108(假设合理范围【红色部分】是-128~0~127,便于理解,游戏中肯定不可能是这样的),
那么如何计算我们获取多少正的铜币呢?
89 的补码是0101 1001
108 的补码是0110 1100
2次相加为 1100 0101
最高符号位是1,表示结果溢出了,此时真值为-59.
以上为溢出的基础知识,大家有问题可以在下面提问!
知无不言言无不尽!******************************************************
刚才有人说我不会,还出来给大家讲!
再次重申:本人确实是菜鸟一个,但是我只是把我知道的教给大家!
请不要用批判的态度来看待这段文字,要以学习的态度来看这段文字,你会豁然开朗,否则只会自取其辱!
******************************************************
本人业余者一个,说错的地方还请谅解!下集更加精彩!
|
评分
-
查看全部评分
|