第二章 数据的机器级表示与处理数值数据的表示非数值数据的.ppt

第二章 数据的机器级表示与处理数值数据的表示非数值数据的.ppt

  1. 1、本文档共70页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第二章 数据的机器级表示与处理数值数据的表示非数值数据的

整数的乘运算 在计算机内部,一定有x2 ? 0吗? 若x是带符号整数,则不一定! 如x是浮点数,则一定! 例如,当 n=4 时, 52=-70 ! 0101 0101 0101 0101 ? +只取低4位,值为-111B=-7 如何判断返回的z是正确值? 当 !x || z/x==y 为真时 什么情况下,乘积是正确的呢? 当 -2n-1 ≤ x*y 2n-1 (不溢出)时 即:乘积的高n位为全0或全1,并等于低n位的最高位! 即:乘积的高n+1位为全0或全1 int mul(int x, int y) { int z=x*y; return z; } 若x、y和z都改成unsigned类型,则判断方式为 结果溢出 乘积的高n位为全0,则不溢出 整数的乘运算 结论:假定两个n位无符号整数xu和yu对应的机器数为Xu和Yu,pu=xu×yu,pu为n位无符号整数且对应的机器数为Pu; 两个n位带符号整数xs和ys对应的机器数为Xs和Ys,ps=xs×ys,ps为n位带符号整数且对应的机器数为Ps。 若Xu=Xs且Yu=Ys,则Pu=Ps。 可用无符号乘来实现带符号乘,但高n位无法得到,故不能判断溢出。 无符号乘法器 Xu Yu Pu n n n n pu=xu*yu; 带符号乘法器 Xs Ys Ps n n n n ps=xs*ys; Puh Psh Puh Psh ≠ 无符号:若Puh=0,则不溢出 带符号:若Psh每位都等于Ps的最高位,则不溢出 整数乘法溢出漏洞 以下程序存在什么漏洞,引起该漏洞的原因是什么。 /* 复制数组到堆中,count为数组元素个数 */ int copy_array(int *array, int count) { int i; /* 在堆区申请一块内存 */ int *myarray = (int *) malloc(count*sizeof(int)); if (myarray == NULL) return -1; for (i = 0; i count; i++) myarray[i] = array[i]; return count; } 当参数count很大时,则count*sizeof(int)会溢出。如count=230+1时, count*sizeof(int)=4。 堆(heap)中大量数据被破坏! 攻击者可构造特殊参数来触发整数溢出,以一段预设信息覆盖一个已分配的堆缓冲区,造成远程服务器崩溃或者改变内存数据并执行任意代码。 2002年,Sun Microsystems公司的RPC XDR库带的xdr_array函数发生整数溢出漏洞,攻击者可利用该漏洞从远程或本地获取root权限。 变量与常数之间的乘运算 整数乘法运算比移位和加法等运算所用时间长,通常一次乘法运算需要多个时钟周期,而一次移位、加法和减法等运算只要一个或更少的时钟周期,因此,编译器在处理变量与常数相乘时,往往以移位、加法和减法的组合运算来代替乘法运算。 例如,对于表达式x*20,编译器可以利用20=16+4=24+22,将x*20转换为(x4)+(x2),这样,一次乘法转换成了两次移位和一次加法。 不管是无符号数还是带符号整数的乘法,即使乘积溢出时,利用移位和加减运算组合的方式得到的结果都是和采用直接相乘的结果是一样的。 整数的除运算 对于带符号整数来说,n位整数除以n位整数,除-2n-1/-1= 2n-1会发生溢出外,其余情况都不会发生溢出。Why? 因为商的绝对值不可能比被除数的绝对值更大,因而不会发生溢出,也就不会像整数乘法运算那样发生整数溢出漏洞。 因为整数除法,其商也是整数,所以,在不能整除时需要进行舍入,通常按照朝0方向舍入,即正数商取比自身小的最接近整数(Floor,地板),负数商取比自身大的最接近整数(Ceiling,天板)。 例如,7/2=?, -7/2=? 7/2=3, -7/2=-3 整数除0的结果可以用什么机器数表示? 整数除0的结果无法用一个机器数表示! 整数除法时,除数不能为0,否则会发生“异常”,此时,需要调出操作系统中的异常处理程序来处理。 整数的除运算 代码段一: int a = 0 int b = a / -1; printf(%d\n, b); 运行结果为-2147483648 代码段二: int a = 0 int b = -1; int c = a / b; printf(%d\n, c); 运行结果为“Floatin

文档评论(0)

jixujianchi + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档