“数据溢出”是什么意思?
数据溢出
在计算机中,当要表示的数据超出计算机所使用的数据的表示范围时,则产生数据的溢出。
溢出原因
数据类型超过了计算机字长的界限就会出现数据溢出的情况。导致内存溢出问题的原因有很多,比如:
(1) 使用非类型安全(non-type-safe)的语言如 C/C++ 等。
(2) 以不可靠的方式存取或者复制内存缓冲区。
(3)编译器设置的内存缓冲区太靠近关键数据结构。
因素分析
1.内存溢出问题是 C 语言或者 C++ 语言所固有的缺陷,它们既不检查数组边界,又不检查类型可靠性(type-safety)。众所周知,用 C/C++ 语言开发的程序由于目标代码非常接近机器内核,因而能够直接访问内存和寄存器,这种特性大大提升了 C/C++ 语言代码的性能。只要合理编码,C/C++应用程序在执行效率上必然优于其它高级语言。然而,C/C++ 语言导致内存溢出问题的可能性也要大许多。其他语言也存在内存溢出问题,但它往往不是程序员的失误,而是应用程序的运行时环境出错所致。
2. 当应用程序读取用户(也可能是恶意攻击者)数据,试图复制到应用程序开辟的内存缓冲区中,却无法保证缓冲区的空间足够时(换言之,假设代码申请了 N 字节大小的内存缓冲区,随后又向其中复制超过 N 字节的数据)。内存缓冲区就可能会溢出。想一想,如果你向 12 盎司的玻璃杯中倒入 16 盎司水,那么多出来的 4 盎司水怎么办?当然会满到玻璃杯外面了!
3. 最重要的是,C/C++编译器开辟的内存缓冲区常常邻近重要的数据结构。假设某个函数的堆栈紧接在在内存缓冲区后面时,其中保存的函数返回地址就会与内存缓冲区相邻。此时,恶意攻击者就可以向内存缓冲区复制大量数据,从而使得内存缓冲区溢出并覆盖原先保存于堆栈中的函数返回地址。这样,函数的返回地址就被攻击者换成了他指定的数值;一旦函数调用完毕,就会继续执行“函数返回地址”处的代码。非但如此,C++ 的某些其它数据结构,比如 v-table 、例外事件处理程序、函数指针等,也可能受到类似的攻击。
java 溢出是什么意思
你说的这个溢出属于数值范围溢出,low和high都是int型,int类型由它定义的变量的数值范围是有限的,想必你也知道,你在执行(low+high)/2的时候,求和操作可能使求和后的结果大于int类型所能表示的数值范围,这样就会产生数据溢出。改为减,可以避免。不过我觉得这样的情况仅发生在high和low的数值都很大的情况下。其实没必要考虑这样的问题,若溢出,会有异常提醒你,一般的int足够你用了,嫌小改为long。欢迎大家一起讨论
C语言中溢出是什么意思
1、溢出: 数据类型超过了计算机字长的界限而出现的数据溢出;2、溢出可能原因: 当应用程序读取用户数据,复制到应用程序开辟的内存缓冲区中,却无法保证缓冲区的空间足够时 (假设定义数组int Array[10], 而在调用时使用Array[11] 或存放的数据超过int类型容量等), 内存缓冲区就可能会溢出.3、溢出因素分析: 由于C/C++语言所固有的缺陷,既不检查数组边界,又不检查类型可靠性,且用C/C++语言开发的程序由于目标代码非常接近机器内核,因而能够直接访问内存和寄存器,只要合理编码,C/C++应用程序在执行效率上必然优于其它高级语言。然而,C/C++语言导致内存溢出问题的可能性也要大许多。
计算机中的“溢出”到底是什么意思
溢出是黑客开发的控制别人电脑的程序。溢出是黑客利用操作系统的漏洞,专门开发了一种程序,加相应的参数运行后,就可以得到你电脑具有管理员资格的控制权,你在你自己电脑上能够运行的东西他可以全部做到,等于你的电脑就是他的了。当你用 C/C++ 书写代码时,应该处处留意如何处理来自用户的数据。如果一个函数的数据来源不可靠,又用到内存缓冲区,那么它就必须要做到知道内存缓冲区的总长度和检验内存缓冲区。扩展资料缓冲区溢出缓冲区是用户为程序运行时在计算机中申请的一段连续的内存,它保存了给定类型的数据。缓冲区溢出指的是一种常见且危害很大的系统攻击手段,通过向程序的缓冲区写入超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其他的指令,以达到攻击的目的。数据溢出在计算机中,当要表示的数据超出计算机所使用的数据的表示范围时,则产生数据的溢出。客观原因在 C 和 C++ 语言本身中,这个问题是不容易解决的。该问题基于 C 语言的根本设计决定(特别是 C 语言中指针和数组的处理方式)。由于 C++ 是最兼容的 C 语言超集,它也具有相同的问题。现实状况在几乎所有计算机语言中,不管是新的语言还是旧的语言,使缓冲区溢出的任何尝试通常都会被该语言本身自动检测并阻止(比如通过引发一个异常或根据需要给缓冲区添加更多空间)。但是有两种语言不是这样:C 和 C++ 语言。参考资料:百度百科-溢出
溢出和进位有何区别?什么条件下OV置1
处理器内部以补码表示有符号数,8个二进制位能够表达的整数范围是:+127 ~ -128,16位表达的范围是:+32767 ~ -32768.如果运算结果超出了这个范围,就是产生了溢出,有溢出,说明有符号数的运算结果不正确
例如:
3AH + 7CH=B6H,就是58 + 124=182,已经超出-128 ~ 127范围,产生溢出,所以OF = 1;另一方面,补码B6H表达真值是-74,显然运算结果也不正确。
溢出标志OF和进位标志CF是两个意义不同的标志.进位标志表示无符号数运算结果是否超出范围,运算结果仍然正确;溢出标志表示有符号数运算结果是否超出范围,运算结果已经不正确。
请看例子
例1:3AH + 7CH=B6H
无符号数运算:58+124=182,范围内,无进位
有符号数运算: 58+124=182 ,范围外,有溢出
例2:AAH + 7CH=(1)26H
无符号数运算:170+124=294,范围外,有进位
有符号数运算:-86+124=28 ,范围内,无溢出
处理器对两个操作数进行运算时,按照无符号数求得结果,并相应设置进位标志CF;同时,根据是否超出有符号数的范围设置溢出标志OF。
应该利用哪个标志,则由程序员来决定。也就是说,如果将参加运算的操作数认为是无符号数,就应该关心进位;认为是有符号数,则要注意是否溢出。
判断运算结果是否溢出有一个简单的规则:只有当两个相同符号数相加,而运算结果的符号与原数据符号相反时,产生溢出;因为,此时的运算结果显然不正确。其他情况下,则不会产生溢出。
溢出和进位到底有什么区别啊?比如寄存器全都是8位的。
溢出,是指数据过大,超出了编码所能表示的范围。对于八位二进制【无符号数】,表示范围是 0~255。 当运算结果,达到 256 以及更大,就溢出了,特征是“进位为一”。对于八位二进制【带符号数】,表示范围是 -128~+127。 当运算结果,小于-128 或大于 127,就溢出了,特征是“符号错误”。因此,当出现了进位,必然就是“无符号数溢出”了。------------------------现在,很多作者的基本概念都不清,教材中都是乱讲。他们只是把“带符号数”的溢出,称为“溢出”。而错误的把“无符号数”的溢出,称为“进位”。那么,有进位,就一定溢出吗?显然不是的,按照“现代说法”,它们两者,根本就没有关系。
溢出和进位的区别
溢出,本是通用的名词。可以理解为:容器太小。但是,计算机专业中,超过容器范围的事情,就分成了“进位”和“溢出”两种说法。人类所用的:自然数、整数。在计算机专业人嘴里,就改称为:无符号数、带符号数。不论什么数,在计算机中,都是用“二进制机器码”表示和存储。8 位的二进制机器码, 可代表无符号数的范围是:0~255。 可代表带符号数的范围是:-128~+127。当运算结果,超出了上述的范围,必然就会溢出。Intel 设计 CPU 时,规定了两个标志位。 无符号数运算结果超出上下限,将有:CF = 1,这就叫“进位”。 有符号数运算结果超出上下限,将有:OF = 1,这才叫做“溢出”。--------------------计算:1111 1110 + 1111 1101 = (进位 1) 1111 1011。如果这是无符号数,就是:254 + 253 = (256) 251。 结果应该是 507,超出了 255,进位=1。如果这是带符号数,就是:(-2) + (-3) = (舍弃进位) (-5)。 结果不超范围,没有溢出,结果正确。--------------------计算:0111 1110 + 0111 1101 = (0) 1111 1011。如果这是无符号数,就是:126 + 125 = (0) 251。 结果不超出 255,结果正确。进位=0。如果这是带符号数,就是:+ 126 + 125 = (舍弃进位) (-5)。 结果超范围,溢出了,结果符号不对,结果错。--------------------
如何判断是否溢出?
容器太小,就会溢出。计算机中,是用机器码,代表两种常用的数字,其范围如下:机器码,无论代表什么数字,只要运算结果超出范围,就是【溢出】。但是,在计算机专业人的嘴里,就不一样了。【无符号数的溢出】,不叫溢出,要叫做【进位】。【带符号数的溢出】,才叫做【溢出】。搞计算机的这些人,基本概念不清,却自命不凡!冒充脑回路清奇。。。正常人对此,就只能无语了。---------------------------按照计算机专业的说法: 溢出,是指“补码运算结果超出范围”。 溢出的特征,是“符号错误”。知道了这些,判断是否溢出,就很容易了。一、无符号数的运算,肯定不会溢出。只有进位。二、只有:正+正、负+负,才可能溢出。不是这些,就绝不会溢出。三、人工用数值计算。如果,和,不超出范围,就不会溢出。四、人工用补码计算。和的符号,如果正确,就没有溢出。五、编个程序,让计算机计算。然后观察溢出标志位,为零,就没有溢出。六、人工用补码计算,如“最高位的进位”和“次高位的进位”相同,就没有溢出。第六种,本是 CPU 的硬件所用的方法。其理论基础,也是很晦涩难懂的。异或运算,一般也不需要初学者掌握。但是,一些爱得瑟的老师,偏爱介绍这种方法。其实,这是很无聊的表现,总想难为难为学生。
汇编中如何判断是否溢出
JO 溢出转移.
1、用一个8位无符号数表示它的整数范围是0—+255,如果运算超过了这个范围就会产生了进位和借位,例如:你拿124加150等于274,这数已经超过0—+255范围就产生进位CF=1了。
2、如果认为上面那二个是有符号数相加同样也是超过它的表达范围(-128-+127)就产生溢出OF=1。
注意:负数要用补码表示
网上找的,学过,但是不记得了