对于变量的值超出其定义的数据类型的表示范围,这种情况称为溢出。
书上以shot型变量为例画出了溢出的二进制原理,如图1。
图1:
图中变量a换算成十进制为32767,变量b换算成十进制为3,本意想得到32770,不过由于溢出,得到的结果变量c换算成十进制为-2。
上机演示后,计算机输出的结果却和理论上的不一样,变量c为-32767,并不是原理上的-2,如图2。
图2:
为什么会有这种情况?难道是溢出的原理不是书上那样?
带着这个疑问,我又试验了a=32766时,b=1、b=2和b=3三种情况。变量c对应的值为32767、-32768和-32767。如图3、图4、图5:
图3:
图4:
图5:
当b=1时,变量c刚好达到shot型的临界范围;当b=2和b=3时,变量c的结果已经和理论值不一样。但是联系图2,我发现,计算机得到的溢出的值也是有规律的,即从shot型的最小值开始递增。
由此猜想:计算机在内存中为每个变量单独且连续分配了65535个字节的空间,里面存储了从-32768到32767的数值,计算机在做加法时,是先找到变量a的值的对应内存地址,然后按照变量b的值查找内存地址,最后再将那个地址里的值赋予变量c(例如变量b的值为1,则在变量a当前值往下找一格,得到的值再赋予变量c)。
为了证明我的猜想,做了如下试验:当a=32766,b=32770时,c=?
如果猜想是正确的,那么变量c的值应该是从a=32766这一值所在的内存地址,往下移动32770格后,其内存地址存储的值,即为0,如图6。
图6:
值得注意的是:变量b的值,并不是输入的32770,显示的是-32766。由于变量abc都是short型,所以32770已经超出了范围,按照猜想,由于32770=32767+3,b此时的值应该是b=32767所在的内存地址往下移三格后,其内存地址存储的值。
至此,我没发现任何与猜想相悖的情况,但为了保险起见,又做了如下试验:当a=32766,b=65537时,c=?
由于65537=32767+32770已经超出了short的范围,所以b的值应该是b=32767所在的内存地址往下移动32770格后,其内存地址存储的值,即为1。
而变量c的值应该是从a=32766这一值所在的内存地址,往下移动65537格后,其内存地址存储的值,为32767,如图7。
图7:
由此可见,猜想是符合实际情况的。
另外,对比图3和图7,虽然变量c的值都为32767,但是两图中32767的来源却不一样。在图3中,计算机是在内存地址中把short型变量a的最大值32767赋予变量c;而在图7中,计算机是在内存地址中把short型变量b的最大值32767赋予变量c。
结论:书上溢出的原理是正确的,只是由于计算机的工作方式等原因,才会使计算机输出的结果和理论上不一样。
以上观点均为个人看法,如有错误,欢迎大家批评指正。
书上以shot型变量为例画出了溢出的二进制原理,如图1。
图1:
图中变量a换算成十进制为32767,变量b换算成十进制为3,本意想得到32770,不过由于溢出,得到的结果变量c换算成十进制为-2。
上机演示后,计算机输出的结果却和理论上的不一样,变量c为-32767,并不是原理上的-2,如图2。
图2:
为什么会有这种情况?难道是溢出的原理不是书上那样?
带着这个疑问,我又试验了a=32766时,b=1、b=2和b=3三种情况。变量c对应的值为32767、-32768和-32767。如图3、图4、图5:
图3:
图4:
图5:
当b=1时,变量c刚好达到shot型的临界范围;当b=2和b=3时,变量c的结果已经和理论值不一样。但是联系图2,我发现,计算机得到的溢出的值也是有规律的,即从shot型的最小值开始递增。
由此猜想:计算机在内存中为每个变量单独且连续分配了65535个字节的空间,里面存储了从-32768到32767的数值,计算机在做加法时,是先找到变量a的值的对应内存地址,然后按照变量b的值查找内存地址,最后再将那个地址里的值赋予变量c(例如变量b的值为1,则在变量a当前值往下找一格,得到的值再赋予变量c)。
为了证明我的猜想,做了如下试验:当a=32766,b=32770时,c=?
如果猜想是正确的,那么变量c的值应该是从a=32766这一值所在的内存地址,往下移动32770格后,其内存地址存储的值,即为0,如图6。
图6:
值得注意的是:变量b的值,并不是输入的32770,显示的是-32766。由于变量abc都是short型,所以32770已经超出了范围,按照猜想,由于32770=32767+3,b此时的值应该是b=32767所在的内存地址往下移三格后,其内存地址存储的值。
至此,我没发现任何与猜想相悖的情况,但为了保险起见,又做了如下试验:当a=32766,b=65537时,c=?
由于65537=32767+32770已经超出了short的范围,所以b的值应该是b=32767所在的内存地址往下移动32770格后,其内存地址存储的值,即为1。
而变量c的值应该是从a=32766这一值所在的内存地址,往下移动65537格后,其内存地址存储的值,为32767,如图7。
图7:
由此可见,猜想是符合实际情况的。
另外,对比图3和图7,虽然变量c的值都为32767,但是两图中32767的来源却不一样。在图3中,计算机是在内存地址中把short型变量a的最大值32767赋予变量c;而在图7中,计算机是在内存地址中把short型变量b的最大值32767赋予变量c。
结论:书上溢出的原理是正确的,只是由于计算机的工作方式等原因,才会使计算机输出的结果和理论上不一样。
以上观点均为个人看法,如有错误,欢迎大家批评指正。
发表评论
-
SQL:目录
2013-05-04 22:42 507第一章:关系型数据库管理系统概述 http://131 ... -
SQL:第六课
2013-04-26 17:37 626一、Sybase.PowerDesigner.15.0 二、 ... -
SQL:第五课
2013-04-26 17:34 565第六章: 第七章: 第八章: -
SQL:第四课
2013-04-20 18:56 831第五章: 练习1: USE ... -
SQL:第三课
2013-04-20 11:27 645第四章:DML语句 练习: CREATE DATABA ... -
SQL:第二课
2013-04-17 22:11 713第二章: 第三章: 第二章作业:简易大学教学管理数据库 ... -
SQL:第一课
2013-04-16 22:09 736... -
C语言:目录
2013-04-15 23:11 591第一章:软件开发概述 http://131947319 ... -
C语言:第九课
2013-04-15 22:54 615一、C语言的数据类型包括基本类型(整形,字符型,浮点型),指针 ... -
C语言:第八课
2013-04-15 22:36 703一、在C语言程序设计时 ... -
C语言:第七课
2013-04-15 21:47 547一、数组:按一定顺序排列,具有某种相同性质的同类型变量的集合。 ... -
C语言:第六课
2013-04-06 22:47 561一、循环控制语句控制一个代码块多次执行,直到某个条件满足。重复 ... -
C语言:第五课
2013-04-02 22:41 839一、所有程序在执行时,程序中的语句按其先后顺序执行。这种按照语 ... -
C语言:关于数据类型的自动转换
2013-04-02 19:11 1312在C语言中,当使用多个 ... -
C语言:第四课
2013-04-01 21:28 765一、浮点类型的除法 ... -
C语言:第三课
2013-03-30 21:03 8591、计算机在通电状态下 ... -
C语言:第二课
2013-03-28 22:05 10051、C程序是以函数为基 ... -
C语言:第一课
2013-03-27 21:52 7421、软件是为了完成某些特定功能而编制的一到多个程序文件的集合。 ...
相关推荐
CBOC:一个C语言缓冲区溢出漏洞有效检测工具,陈石坤,李舟军,冲区溢出是C程序中很多安全问题的根源。本文给出一个C语言缓冲区溢出漏洞的有效检测工具CBOC(C Buffer Overflow Checker)。该工具基于符��
自己动手实现的缓冲区溢出实例,参考0Day安全,整个文档包含5个部分的代码,分别如下: 1.反汇编修改程序的例子 2.1-缓冲区溢出-修改邻接变量 2.2-缓冲区溢出-修改执行流程 2.3-缓冲区溢出-植入代码 寻找messagebox...
通过视频讲解C语言程序的运行时结构以及缓冲区溢出攻击原理。
C语言源程序的缓冲区溢出漏洞分析及解决方案
缓冲区溢出教程及配套代码 缓冲区溢出教程及配套光盘 (c语言 汇编 工具)
整型数据的溢出说明。介绍了C语言中关于整型数据溢出的相关知识,适合于初学者的理解应用。
C语言中溢出错误分析和防范
C语言的溢出错误分析与防范.pdf
73-看门狗溢出测试(51单片机C语言实例Proteus仿真和代码)73-看门狗溢出测试(51单片机C语言实例Proteus仿真和代码)73-看门狗溢出测试(51单片机C语言实例Proteus仿真和代码)73-看门狗溢出测试(51单片机C语言实例...
黑客就是通过改变地址来攻击他人的程序的。这乃中科院视频,有助于提高对C++的理解和认识。
24. C语言防止缓冲区溢出方法 126 25. C语言高效编程秘籍 128 26. C运算符优先级口诀 133 27. do/while(0)的妙用 134 28. exit()和return()的区别 140 29. exit子程序终止函数与return的差别 141 30. extern与static...
该程序是我写的博客“一起talk C栗子吧(第三十四回:C语言实例--巧用溢出计算最值)”的配套程序,共享给大家使用
单片机C语言实例-看门狗溢出测试.zip
在Windows XP VC++6.0环境下运行通过的缓冲区溢出程序源码
这是用单片机调试过的C语言程序!!! 这是用单片机调试过的C语言程序!!!
CoSy C语言编译器程序缓冲区溢出研究.pdf
MSP430_C语言编程的程序堆栈溢出分析
24. C语言防止缓冲区溢出方法 126 25. C语言高效编程秘籍 128 26. C运算符优先级口诀 133 27. do/while(0)的妙用 134 28. exit()和return()的区别 140 29. exit子程序终止函数与return的差别 141 30. extern与static...
2. 虚拟内存到底是什么?为什么我们在C语言中看到的地址是假的? 3. 虚拟地址空间以及编译模式 4. C语言内存对齐,...栈溢出又是怎么回事? 12. 一个函数在栈上到底是怎样的? 13. 函数调用惯例(Calling Convention)
本文实例汇总了C语言实现的快速幂取模算法,是比较常见的算法。分享给大家供大家参考之用。具体如下: 首先,所谓的快速幂,实际上是快速幂取模的缩写,简单的说,就是快速的求一个幂式的模(余)。在程序设计过程中,...