Shurrik 发表于 2015-6-19 15:51:56

一、溢出基础知识之补码-WPE

溢出,其实并不神秘!(以下阐述若有错误或不足之处,请勿喷我)
所谓溢出,就是在计算机中,当要表示的数据超出计算机所使用的数据的表示范围。
例如,计算机中只能表示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.

以上为溢出的基础知识,大家有问题可以在下面提问!
知无不言言无不尽!******************************************************
刚才有人说我不会,还出来给大家讲!
再次重申:本人确实是菜鸟一个,但是我只是把我知道的教给大家!
请不要用批判的态度来看待这段文字,要以学习的态度来看这段文字,你会豁然开朗,否则只会自取其辱!
******************************************************
本人业余者一个,说错的地方还请谅解!下集更加精彩!

虫虫醉风 发表于 2015-6-19 16:07:28

:lol实在看不懂

qq6353694 发表于 2015-6-19 21:44:34

虽然看不明白,但是还是顶一下。。。。

虫虫♂微笑 发表于 2015-6-20 10:05:37

;P;P;P;P;P;P;P;P

虫虫♂微笑 发表于 2015-6-20 10:06:25

50权限怎么这么难

虫虫♂黑天 发表于 2015-6-20 12:22:14


虽然看不明白,但是还是顶一下

虫虫♂盘古 发表于 2015-6-20 23:45:55

看不懂啊

569472150 发表于 2015-6-23 11:26:20

看到这些眼睛有点花

xsllg 发表于 2015-6-24 11:55:14

看来不是给小白看的

虫虫♂学习 发表于 2015-6-24 21:59:33

继续学习 :)
页: [1] 2 3 4 5 6
查看完整版本: 一、溢出基础知识之补码-WPE