当然就是某项活动要有外部收益,而且是活动的主体得不到的收益,或许就是策略上负出感觉就是负外溢性吧。采用双符号位检测溢出的方法:在运算时,两个符号位同时参加运算,结果中如果两个符号位不同,则表示产生了溢出若符号为01,则表示运算结果大于允许取值范围的最大正数,称为正溢出;若符号位为10,则表示运算结果是负数,其值小于允许取值范围的最小负数,称为负溢出两个符号位的最高位仍为正确的符号加法溢出:
无符号整数溢出判断较简单
有符号整数溢出的时候只存在正溢出和负溢出两种情况,即两正数相加得到一个负数或两负数相加得到一个正数。
需要注意的是
这种方法是无法判断溢出的,因为x+y无论是否溢出,x+y-y始终等于x是因为补码加上形成一个阿贝尔群,由阿贝尔群的交换律和结合律有(x+y)-x==y。
减法溢出
减去一个数可以理解为加上这个数的负数,于是
但是这样写是存在一定问题的,没有考虑TMIN(即取值范围的最小值,32位时为-2147483648),TMIN没有相反数,所以需要考虑y为TMIN的情况。其实当y==TMIN时,只有在x>=0的情况下x-y才会溢出
乘法溢出否。
用变形补码进行加减运算时,当运算结果的符号位出现“01”或者“10”时,则表示产生溢出。
变形补码的最高位(第一个符号位)总是表示正确的符号,比如"00"、“01”分别表示正数、正溢出(上溢),"11"、“10”表示负数、负溢出(下溢)。
总的说来就是符号位左边那一位表示正确的符号,0为正,1为负;右边那一位如果和左边的相同,如:"00”表示正且无溢出,"11"表示负且无溢出。
如果右边那一位与左边那一位不一样,则表示有溢出。在用二进制进行加减计算的时候,要看“最高位的进位”就“次高位的进位”。
这两个进位,如果相同,则无溢出。若不同,则溢出。
拓展:
1
在几乎所有计算机语言中,不管是新的语言还是旧的语言,使缓冲区溢出的任何尝试通常都会被该语言本身自动检测并阻止(比如通过引发一个异常或根据需要给缓冲区添加更多空间)。
2
当应用程序读取用户(也可能是恶意攻击者)数据,试图复制到应用程序开辟的内存缓冲区中,却无法保证缓冲区的空间足够时(换言之,假设代码申请了
N
字节大小的内存缓冲区,随后又向其中复制超过
N
字节的数据)。内存缓冲区就可能会溢出。想一想,如果你向
12
盎司的玻璃杯中倒入
16
盎司水,那么多出来的
4
盎司水怎么办?当然会满到玻璃杯外面了!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)