整数溢出?

csoma 2012-08-25 11:18:19
怎样判断表达式溢出?
给个实例!
...全文
381 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
晚安_好梦 2012-09-13
  • 打赏
  • 举报
回复
回答错误,直接干掉吧,对不起。
晚安_好梦 2012-09-13
  • 打赏
  • 举报
回复
在怕溢出的地方和宏比较一下吧!
在#include <limits.h> 中定义了很多宏。

例如:

int i = 0xffffff;
int j = 0xffff;

int k = 0;

k = i * j;
if( k > UINT_MAX){
......
}
mujiok2003 2012-09-03
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

cpu 状态字中有溢出标志位
[/Quote]

正确。
赵4老师 2012-09-03
  • 打赏
  • 举报
回复
//有符号整形a和b,如何判断a+b是否溢出
#include <stdio.h>
int ifo_add(int a,int b) {
__asm {
mov eax,a
add eax,b
jo overflowed
xor eax,eax
jmp no_overflowed
overflowed:
mov eax,1
no_overflowed:
}
}
int main() {
int a,b;

a= 1;b= 2;printf("%11d+(%2d) %d\n",a,b,ifo_add(a,b));
a= -1;b=-2;printf("%11d+(%2d) %d\n",a,b,ifo_add(a,b));
a= 2147483647;b= 1;printf("%11d+(%2d) %d\n",a,b,ifo_add(a,b));
a=-2147483647;b=-1;printf("%11d+(%2d) %d\n",a,b,ifo_add(a,b));
a=-2147483647;b=-2;printf("%11d+(%2d) %d\n",a,b,ifo_add(a,b));
}
// 1+( 2) 0
// -1+(-2) 0
// 2147483647+( 1) 1
//-2147483647+(-1) 0
//-2147483647+(-2) 1
whucv 2012-09-02
  • 打赏
  • 举报
回复
如在一个域中输入的数据超过了它的要求就会引发数据溢出问题,多余的数据就可以作为指令在计算机上运行。据有关安全小组称,操作系统中超过50%的安全漏洞都是由内存溢出引起的,其中大多数与微软的技术有关。
数据类型超过了计算机字长的界限就会出现数据溢出的情况。导致内存溢出问题的原因有很多,比如:   (1) 使用非类型安全(non-type-safe)的语言如 C/C++ 等。 内存溢出问题是 C 语言或者 C++ 语言所固有的缺陷,它们既不检查数组边界,又不检查类型可靠性(type-safety)。众所周知,用 C/C++ 语言开发的程序由于目标代码非常接近机器内核,因而能够直接访问内存和寄存器,这种特性大大提升了 C/C++ 语言代码的性能。只要合理编码,C/C++ 应用程序在执行效率上必然优于其它高级语言。然而,C/C++ 语言导致内存溢出问题的可能性也要大许多。其他语言也存在内存溢出问题,但它往往不是程序员的失误,而是应用程序的运行时环境出错所致。  
(2) 以不可靠的方式存取或者复制内存缓冲区。   
(3) 编译器设置的内存缓冲区太靠近关键数据结构。
csoma 2012-09-02
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]

显然不对,你用429496729*1000,这个显然发生溢出了,不用赋值,因为C语言中一个表达式求值的结果是和表达式所有变量和常量中最高的那个类型决定的。有很多表达式,在表达式求值的过程中就会发生溢出的。因为C语言要计算,最后生成的机器语言还是必须使用CPU的有限宽度寄存器。
另外要考虑隐式转换,无符号和有符号的计算结果肯定是有符号的。

还是自己约束各个变量范围,提前用if检查范围预防比……
[/Quote]

你的意思是:
无论算术表达式,赋值表达式。它们都有可能发生溢出!
如果是这样,怎样防止溢出发生呢?

给个实例说明下。
辰岡墨竹 2012-09-02
  • 打赏
  • 举报
回复
显然不对,你用429496729*1000,这个显然发生溢出了,不用赋值,因为C语言中一个表达式求值的结果是和表达式所有变量和常量中最高的那个类型决定的。有很多表达式,在表达式求值的过程中就会发生溢出的。因为C语言要计算,最后生成的机器语言还是必须使用CPU的有限宽度寄存器。
另外要考虑隐式转换,无符号和有符号的计算结果肯定是有符号的。

还是自己约束各个变量范围,提前用if检查范围预防比较好。虽然CPU提供溢出标志位,但是C语言会生成很多额外的代码,除非你直接用汇编进行表达式运算,否则难以检测的。
csoma 2012-09-02
  • 打赏
  • 举报
回复
一,C语言的溢出,是发生在赋值表达式,对否?

二,算术表达式,是没有溢出的说法,对否?

二,如果赋值表达式的左操作数,不能保存右操作数,就会溢出,对否?

 
//32位计算机

unsigned int x=4294967295;
int y=1;
unsigned int z;
z=x+y; /*
算术表达式:x+y,计算的结果是:4294967296。但是,它没有溢出的说法,对否?
z=4294967296,保存的结果是:4294967296。它就溢出了,对否?
所以,只是赋值表达式的结果(左操作数),才有溢出的说法,对否?
*/





竞天问 2012-08-26
  • 打赏
  • 举报
回复
表达式的值还取决于计算表达式时各个变量的值,绝大多数情况下不能事先判断。
在C/C++里我不知道怎么判断
但可以嵌入汇编指令,查询标志位
自由建客 2012-08-26
  • 打赏
  • 举报
回复
根本问题,是否溢出不能事先看表达式,只能事后看结果。
qqcom2286734801 2012-08-26
  • 打赏
  • 举报
回复
比如你用32位的装入16位的就会溢出。
gfvera 2012-08-25
  • 打赏
  • 举报
回复
short 和 int 最小取值范围是 -32767 ~ 32767、unsigned short 0 ~ 65535
long 和 int 最小取值范围是 -2147483647 ~ 2147483647、 unsigned int 0 ~ 4294967295
char 和 unsigned 这个不是用来处理数据的取值 -127 ~ 127 和 254

C语言还规定了每种不同的整数类型的打印符号也是不同的

short打印符号%hd 、unsigned short打印符号 %u。
int 打印符号 %d,unsigned 打印符号 %u。
long 打印符号 %ld、unsigned 打印符号 %lu
chat 打印符号和int一样。
lin5161678 2012-08-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
int a=32767,b;
b=a+1;
printf("%d",a);
此题的b就是属于溢出,因为按照常理,b应该是32768,但是不是,因为int是2个字节,数据表示-32768~32767;溢出,所以你应该把a和b定义为long int,这样数据就够表示了,溢出还是不溢出要注意数据的类型和表示的范围,注意就好了,楼主找些此类型的题目练练吧
[/Quote]
乘法才是溢出比较常见的时候 加法算什么
chenqianzeng 2012-08-25
  • 打赏
  • 举报
回复
int a=32767,b;
b=a+1;
printf("%d",a);
此题的b就是属于溢出,因为按照常理,b应该是32768,但是不是,因为int是2个字节,数据表示-32768~32767;溢出,所以你应该把a和b定义为long int,这样数据就够表示了,溢出还是不溢出要注意数据的类型和表示的范围,注意就好了,楼主找些此类型的题目练练吧
AnYidan 2012-08-25
  • 打赏
  • 举报
回复
cpu 状态字中有溢出标志位
ArronJeck 2012-08-25
  • 打赏
  • 举报
回复
溢出是靠自己意识和经验,在需要的地方自己设计限定!
unsigned short i = 0;
unsigned short a=65530,b=65530;
i=a+b;
cout<<i<<endl;

输出是65524,你知道其中原理就行了,自己以后多注意就好了!
系统不会给你报错,因为每个类型他都以循环的方式来计数!
Gloveing 2012-08-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
有这方面的资料或书么?
给个链接!
[/Quote]
Q版缓冲区溢出
csoma 2012-08-25
  • 打赏
  • 举报
回复
有这方面的资料或书么?
给个链接!
ies_sweet 2012-08-25
  • 打赏
  • 举报
回复
这个……

一般来说,还是要靠程序员在设计的时候来避免
jiangshi061 2012-08-25
  • 打赏
  • 举报
回复
溢出不好判断,
如果溢出能判断,那C/C++程序员就不值钱了
加载更多回复(2)

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧