if(x>y)和if(x-y>0)有什么区别?

宇宙379 2011-03-29 08:45:06
为什么后者会溢出
...全文
928 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
lbaihao 2011-03-30
  • 打赏
  • 举报
回复
short a=32767,b=-1;
s>b为真
s-b=-32768<0
很简单的例子。
zjmcly 2011-03-30
  • 打赏
  • 举报
回复
如果是unsigned的话,第二个就有可能溢出啊
孙歌 2011-03-30
  • 打赏
  • 举报
回复
精度问题
qq120848369 2011-03-30
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>

int main()
{
/*16进制*/
unsigned int a=1; //00 00 00 01
unsigned int b=2; //00 00 00 02

/*
a-b=1-2=1+(-2)=(00 00 00 01)+(ff ff ff fe)=ff ff ff ff==MAX_UINT=2^32-1=printf("%u\n",a-b);
*/

printf("%u\n",a-b);

return 0;
}

晨星 2011-03-30
  • 打赏
  • 举报
回复
可以在32位编译器上试试这个程序:
#include <stdio.h>

int main() {
int a = 1 << 30;
int b = -a;
if(a > b)
printf("a > b.\n");
if(a - b > 0)
printf("a - b > 0.\n");
printf("a - b = %d.\n", a - b);
return 0;
}
Rain208 2011-03-30
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 yaodhnet 的回复:]
假如int的取值范围是-100到100
那么:
a=100,b=-100
a>b:true;
a-b=200:内存溢出
[/Quote]


比较有说服力

或者是unsigned int的最大值是 0xffffffff
假设 unsigned int a = 0xfffffffe;
unsigned int b = -10;
则a - b > 0xffffffff 导致溢出

或许可以使用类型提升来解决溢出,但是在实际应用中这样不和法
ValentinsLee 2011-03-30
  • 打赏
  • 举报
回复
这个主要取决你设置的类型,比如你X设置为INT型,y设置为double型,那么系统会自动把INT型转化成double型,可能会出现数据丢失.
AnYidan 2011-03-30
  • 打赏
  • 举报
回复
楼主结贴散分
luciferisnotsatan 2011-03-30
  • 打赏
  • 举报
回复
unsigned 和 signed的区别
purewqk 2011-03-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 pengzhixi 的回复:]
因为当两个unsigned int相减就会产生溢出了。小的减大的,结果还是大于0
[/Quote]

学习了~~~
yaodhnet 2011-03-30
  • 打赏
  • 举报
回复
假如int的取值范围是-100到100
那么:
a=100,b=-100
a>b:true;
a-b=200:内存溢出
cwmwss 2011-03-30
  • 打赏
  • 举报
回复
原来这两个有区别。。
hooha 2011-03-30
  • 打赏
  • 举报
回复
推荐看一下《深入理解计算机系统》CS:APP,你会找到你要的答案,还有好多其他内容都值得一看~~~~~~~
yuncommander 2011-03-30
  • 打赏
  • 举报
回复
前来学习,看见大家都回答的很踊跃,很好的学习氛围,后悔没早点到CSDN,新手报到,以后大家多照顾,谢谢,呵呵
陈思有 2011-03-30
  • 打赏
  • 举报
回复
两个无符号数想减,得到的还是无符号数,
skyworth98 2011-03-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 pengzhixi 的回复:]
因为当两个unsigned int相减就会产生溢出了。小的减大的,结果还是大于0
[/Quote]

不只这种情况,比如,一个很大的负整数,减去一个很大的正整数,结果一样可能溢出为正……
jutolang 2011-03-29
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;
int main(){
unsigned i,j;
cin>>i>>j;
if(i-j>0){cout<<"hello"<<endl; cout<<(i-j);}
else{cout<<"error"<<endl;}

}

1 2//enter
hello
4294967295
xuukai 2011-03-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 masmaster 的回复:]

测试环境:linux,gcc
C/C++ code
root@~ #cat 3.c
#include <stdio.h>

int main (void) {

int a,b;

scanf ("%i%i",&a,&b);
if(a>b) {
printf ("if a>b is ok\n");……
[/Quote]

int 小减大:-;那么得到“error”很对;没有溢出嘛
xuukai 2011-03-29
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 zclmoon 的回复:]

数的类型决定了数的大小范围,当X很大,y为一个很小的负数。。溢出
[/Quote]

只会变成正数,但是不会溢出
xuukai 2011-03-29
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 pengzhixi 的回复:]

自己用一个小的unsigned int去减大的就知道了
[/Quote]

#include <iostream>
using namespace std;
int main(){
unsigned i,j;
cin>>i>>j;
if(i-j>0){cout<<"hello"<<endl;}
else{cout<<"error"<<endl;}
cout<<sizeof i;
}

*================*结果:

1 2//小数减大数,没有发生段错误
hello
4

加载更多回复(14)

69,369

社区成员

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

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