如何判断整数数据的溢出

作者&投稿:邗范 (若有异议请与网页底部的电邮联系)
如何判断整数是否溢出~

根据存储的空间和有无符号位。
例如c或java当中的int型,使用32位,4个字节存储,有符号位。其能存储2^32种不同数据。可存储的数据在-2^31~2^31-1这个范围内,超出则范围则溢出。
若使用不带符号位,则范围为0~2^32-1。
用更加简单的例子,如果使用4位来存储,只能存储2^4=16种不同数据。如果不带符号位,则存储范围为0~15,超出则溢出。如果带符号位,则范围为-8~7,超出则溢出。
在实际编程中,某些编译器会在特定情况下提示溢出问题,但更多情况需要自己处理溢出问题。
有什么具体需求可以在追问中提出。





#include#includeint main(){ int n,i; char s[11],s2[11]="2147483647",*p=s; scanf("%s",s); if(*p=='-') { p++; s2[9]++; } if(strlen(p)>10||strlen(p)==10&&strcmp(p,s2)>0) printf("输入溢出
"); else { for(n=0; *p; p++) n=n*10+*p-'0'; if(s[0]=='-') n=-n; printf("输入的整数%d,没有溢出
",n); } return 0;}

整数溢出,如何判断整数溢出 收藏
C语言中存在两类整数算术运算,有符号运算和无符号运算。在无符号运算里,没有了符号位,所以是没有溢出的概念的。
所有的无符号运算都是以2的n次方为模。如果算术运算符的一个操作数是有符号书,另一个是无符号数,那么有符号数
会被转换为无符号数(表示范围小的总是被转换为表示范围大的),那么溢出也不会发生。但是,当两个操作数都是有符号数
时,溢出就有可能发生。而且溢出的结果是未定义的。当一个运算的结果发生溢出时,任何假设都是不安全的。
例如,假定a和b是两个非负的整型变量(有符号),我们需要检查a+b是否溢出,一种想当然的方式是:
if (a + b < 0)
溢出;
实际上,在现实世界里,这并不能正常运行。当a+b确实发生溢出时,所有关于结果如何的假设均不可靠。比如,在某些
机器的cpu,加法运算将设置一个内部寄存器为四种状态:正,负,零和溢出。在这种机器上,c编译器完全有理由实现以上
的例子,使得a+b返回的不是负,而是这个内存寄存器的溢出状态。显然,if的判断会失败。
一种正确的方式是将a和b都强制转换为无符号整数:
if ( (unsigned)a + (unsigned)b > INT_MAX)
溢出;
这里的int_max值为有符号整型的最大值。在一般的编译器里是一个预定义的常量。ANSI C在limits里定义了INT_MAX,值为
2的31次方-1.
不需要用到无符号算数运算的另一种可行方法是:
if (a > INT_MAX - b )
溢出;
PS : 有符号数的最高位(31位)为符号位,最高位为0的时候,表示正,为1的时候表示负。运算时,符号位不参加运算,但是如果两个数相加,30位需要进1时,那么即表示溢出。

C语言中存在两类整数算术运算,有符号运算和无符号运算。在无符号运算里,没有了符号位,所以是没有溢出的概念的。

所有的无符号运算都是以2的n次方为模。如果算术运算符的一个操作数是有符号书,另一个是无符号数,那么有符号数

会被转换为无符号数(表示范围小的总是被转换为表示范围大的),那么溢出也不会发生。但是,当两个操作数都是有符号数

时,溢出就有可能发生。而且溢出的结果是未定义的。当一个运算的结果发生溢出时,任何假设都是不安全的。

例如,假定a和b是两个非负的整型变量(有符号),我们需要检查a+b是否溢出,一种想当然的方式是:

if (a + b < 0)

溢出;

实际上,在现实世界里,这并不能正常运行。当a+b确实发生溢出时,所有关于结果如何的假设均不可靠。比如,在某些

机器的cpu,加法运算将设置一个内部寄存器为四种状态:正,负,零和溢出。在这种机器上,c编译器完全有理由实现以上

的例子,使得a+b返回的不是负,而是这个内存寄存器的溢出状态。显然,if的判断会失败。

一种正确的方式是将a和b都强制转换为无符号整数:

if ( (unsigned)a + (unsigned)b > INT_MAX)

溢出;

这里的int_max值为有符号整型的最大值。在一般的编译器里是一个预定义的常量。ANSI C在limits里定义了INT_MAX,值为

2的31次方-1.

不需要用到无符号算数运算的另一种可行方法是:

if (a > INT_MAX - b )

溢出;

PS : 有符号数的最高位(31位)为符号位,最高位为0的时候,表示正,为1的时候表示负。运算时,符号位不参加运算,但是如果两个数相加,30位需要进1时,那么即表示溢出。

(1)无符号整数相加,如果结果小于其中任何一个,则溢出;
bool IsOverFlow(unsigned x, unsigned y)
{
unsigned z = x + y;
if(z < x)
return true;
return false;
}

(2) 有符号整数相加,比无符号的相对复杂一点儿:

如果两个整数相加<0,或者两个负数相加>0,(负数在计算机中用补码表示)则溢出。

bool IsOverFlow(int x, int y)
{
int z = x + y;
if(x > 0 && y > 0 && z < 0)
return true;
if(x < 0 && y < 0 && z > 0)
return true;
return false;
}

(3)如何判断一个输入或者转化转化的单个数字是否溢出;if( num>0x7fffffff || num<(signed int)0x80000000)
int类型的最大正数:0x7fffffff;

int类型的最小负数:0x80000000;

溢出,是通用的词汇。

一般来说,容器太小,满了装不下了,就会溢出。

在数据方面,超出预定的位数,就会溢出。

比如,1999 年、2000 年 ...,这是用 4 位数来表示的。

如果到了 9999 年,再过一年,这就需要 5 位数了,否则就会溢出。

电话号码,由 7 位数,升至 8 位,也是这个道理。

-----------------------

计算机中的溢出,是什么意思?

1。数据过大。

  数据超过了预定类型的界限,就会出现的数据溢出。

2。数据量过大。

  如定义数组 Array[10], 而在调用时使用 Array[11]! 内存缓冲区就可能会溢出。

溢出原因分析?

1。程序员经验不足。

  导致内存溢出,程序错乱,甚至死机。

2。程序员水平太高。

  超范围操作内存,以达到不可告人的目的。




检测到缓存溢出是何意思
一些Sasser代码(可以说是插件或木马之类)穿过未打补丁的防火墙,到达没有防护的服务器。当代码进入没有防护服务器的内存时,它马上执行缓存器溢出,将服务器系统级的控制权交给了远端的主机,实现在企业网内的远程控制。卡巴六正是针对Web浏览器或者其他最终用户网络应用的的漏洞防御,并可以检测和防止受保护...

如何用excel判断一组数据在何时有显著性变化?
根据数据做一个折线图,看他的变化趋势

C语言中的问题不明白为什么 新人麻烦详细解释一下谢谢
这里scanf指定逗号为输入的分隔符号。所以输入时数字和字符之间必须有逗号。scanf不指定分隔符时,默认以空白字符(空格、回车、制表符)为分隔符。PS:如果写%d%c不指定分隔符号。由于第二个变量是字符型,输入时中间不要加空格符,否则会将空白符号做为字符接收。

C++中bool 和int 用起来有何区别?
1、bool的值范围只有0和1值,而int的范围为[-2^31 , 2^31 -1] 即 [-2147483648,2147483647]2、bool表示布尔型变量,也就是逻辑型变量的定义符,一般用于逻辑判断 int是一种整数数据类型定义的标示符,一般用于数据计算

常见基础类型有哪些?各有何特点?
常见基础类型及其特点:一、数值类型 数值类型是计算机编程中最基础的数据类型之一,主要包括整数和浮点数。整数类型用于存储整数,如整数、长整数等,占用内存空间相对较小。浮点数类型用于存储带有小数点的数值,如单精度浮点数和双精度浮点数。这类数据类型用于计算、统计分析等场景。二、字符类型 字符类型...

delphi 如何去数据库中的值,和combobox中的值进行判断
如果是输入,你为什么要用combobox?何不用EDIT?你是想要上面这5个字段全进行判断还是只有一个?可以这样:如利用单证员判断:假定你用的是sql 数据库,adoquery 把以下程序写入combobox1的onexit事件里 with adoquery dobeginif active then close;sql:='select * from db ';prepare;open;end;...

原码反码补码的意义
所谓原码就是前面所介绍的二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。 反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。 补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。 1、原码、反码和补码的表示方...

C++ 如何何判断编辑框数据改变
如果是界面上的判断,用控件的change事件,如果是代码里的判断,则用一个变量存放原始值,保存前判断当前编辑框的值跟变量的值是否相等。

用何命令可判断数据包到达目的主机所经过的路径、显示数据包经过的中...
Tracert命令详解 该诊断实用程序将包含不同生存时间 (TTL) 值的 Internet 控制消息协议 (ICMP) 回显数据包发送到目标,以决定到达目标采用的路由。要在转发数据包上的 TTL 之前至少递减 1,必需路径上的每个路由器,所以 TTL 是有效的跃点计数。数据包上的 TTL 到达 0 时,路由器应该将“ICMP 已...

何判断流量这一数据是否合理?一般气体流速和流体流速各在什么范围_百度...
这要看环境,比如容器有容器的值 ,每种气体也不一样,最后换算更是麻烦。太复杂,所以你最好说明你要判断什么,然后提供你要用什么换算。

察隅县18333135224: 判断两个整数相加是否溢出的方法 -
直胀盐酸:[答案] 对于C/C++语言来说,分为无符号整数和有符号整数两种,几乎在所有机器中他们都是用补码表示的,如下:(1)无符号整数相加int uadd_ok(unsigned x, unsigned y){ unsigned z = x + y; if(z 0 && y > 0 && z 0) return 0; return 1;}

察隅县18333135224: 如何判断整数是否溢出 -
直胀盐酸: 根据存储的空间和有无符号位. 例如c或java当中的int型,使用32位,4个字节存储,有符号位.其能存储2^32种不同数据.可存储的数据在-2^31~2^31-1这个范围内,超出则范围则溢出. 若使用不带符号位,则范围为0~2^32-1. 用更加简单的例子,如果使用4位来存储,只能存储2^4=16种不同数据.如果不带符号位,则存储范围为0~15,超出则溢出.如果带符号位,则范围为-8~7,超出则溢出. 在实际编程中,某些编译器会在特定情况下提示溢出问题,但更多情况需要自己处理溢出问题. 有什么具体需求可以在追问中提出.

察隅县18333135224: 计算机基本运算中,补码运算怎样判断数值是否有溢出? -
直胀盐酸:[答案] 追问:那请你进行这运算并判断是否有溢出 -75-64 .回答:溢出了.如果题目直接给的数字,那么你直接计算开是否超出正127或者负128就可以了. 当然,如果你想用计算机那种方法来判断也是可以的,把两个数字转换成二进制 发现相加有进位(减法...

察隅县18333135224: 如何检测C/C++中的整数溢出 -
直胀盐酸: 今天做到一个算法题,结果没有搜到解决方案.方法可能比较繁琐,不知道对不对,如果不对,请点右下角的反对,并且欢迎补充 对于a,b的算数运算检测溢出 加法:如果a,b同正或同负,if(abs(a)+abs(b)<abs(a)) 溢出.a,b不同号恒不会溢出(ps:abs函数为取绝对值,在哪个头文件里自己找) 减法参考加法的比较,只是换个符号 乘法:if(a*b/b!=a) a*b溢出

察隅县18333135224: 判断两个整数相加是否溢出的方法 -
直胀盐酸: 对于C/C++语言来说,分为无符号整数和有符号整数两种,几乎在所有机器中他们都是用补码表示的,如下:(1)无符号整数相加int uadd_ok(unsigned x, unsigned y){ unsigned z = x + y; if(z < x) return 0; return 1;} (2) 有符号整数相加,这个要复杂一些int add_ok(int x, int y){ int z = x + y; if(x > 0 && y > 0 && z < 0) return 0; if(x < 0 && y < 0 && z > 0) return 0; return 1;}

察隅县18333135224: 计算机运算时是如何判断发生溢出的?
直胀盐酸: 计算机运算时是如何判断发生溢出的? ------- “计算机运算”,这里面有软件和硬件方面的判断层次. 硬件就是CPU. CPU是大规模的集成电路,其中有个异或门. 它把运算结果最高位的进位和次高位向最高位的进位相异或,送到OF标志位. 软件则要根据OF的值来判断,OF=1则是溢出.

察隅县18333135224: 如何检测整数溢出 -
直胀盐酸: 无符号时,小数减大数一定溢出,大数减小数一定不溢出判断方法有很多.比较简单的思路是看结果的值是否大于被减数.

察隅县18333135224: 判断两个整数相减会不会溢出 -
直胀盐酸: 补码加法运算溢出判断三种方法: [方法一] Xf、Yf分别两个数的符号位,Zf为运算结果符号位. 当Xf =Yf =0(两数同为正),而Zf=1(结果为负)时,负溢出; 当出现Xf =Yf =1(两数同为负),而Zf=0(结果为正),正溢出.

察隅县18333135224: 判断两个整数相加会不会溢出
直胀盐酸: 实际上,大多数电脑中,整数都是用补码来表示的.发生溢出不会报警,只是将最高位直接截断. /*习题2.30 C语言 开发环境VC++6.0*/ #include<stdio.h> int taddOK(int, int); void main(){ int x, y; printf("Input two integers:\n"); scanf("%d %d",...

察隅县18333135224: 请问:两个无符号数相乘,怎样判断是否溢出? -
直胀盐酸:[答案] 对于2个无符号数判断溢出用进位标志CF判断 有符号的整数用OF判断

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网