请教高手:if (i>j) 和 if (i-j>0)是否等价?

Robincen 2006-11-02 11:12:33
今天笔试考到了一道题,我不知道从哪方面回答:
对于int型变量i,j,条件判断
if (i>j) 和 if (i-j>0)是否等价?给出理由
...全文
1299 47 打赏 收藏 转发到动态 举报
写回复
用AI写文章
47 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiao2004 2006-11-05
  • 打赏
  • 举报
回复
靠,i,j类型,关键看这个。
w_anthony 2006-11-05
  • 打赏
  • 举报
回复
绝对不等价

i=0x7fffffff,j=0x80000000时就不等价,还有一堆相似的相减溢出数都会不等价

就像问if (i==0) 和 if (i==-i)是否等价一样,结果也是不等价。
因为0x00000000和0x80000000同时满足后者,而满足前者的只有0x00000000
dyh1919 2006-11-05
  • 打赏
  • 举报
回复
看完各位的回复

只想说:学习. *_*
believeken 2006-11-05
  • 打赏
  • 举报
回复
向你们学习.....
swteetlove 2006-11-04
  • 打赏
  • 举报
回复
学习
maingg 2006-11-04
  • 打赏
  • 举报
回复
肯定是不等价的
sf0210 2006-11-04
  • 打赏
  • 举报
回复
sf
阿发伯 2006-11-04
  • 打赏
  • 举报
回复
完全等价,汇编码的cmp eax,edx和sub eax,edx除了保存计算结果的区别外,基本是等价的
metaliclp 2006-11-04
  • 打赏
  • 举报
回复
学习ing
做鸡真好吃 2006-11-04
  • 打赏
  • 举报
回复
关注~
OOPhaisky 2006-11-03
  • 打赏
  • 举报
回复
除此之外,就是效率方面的问题了......
OOPhaisky 2006-11-03
  • 打赏
  • 举报
回复
有可能产生溢出。
i<0,j>0时,可能下溢出;
i>0,j<0时,可能上溢出;
这两种情况下,if (i>j) 和 if (i-j>0)不等价。
leilei821006 2006-11-03
  • 打赏
  • 举报
回复
int型的取值范围是-32768~32767
所以i-j的范围为-32768~32767 ,当两个数有正有负的时候,就有可能溢出
而i>j不存在这个问题!!
agaric 2006-11-03
  • 打赏
  • 举报
回复
跟具体数据类型有关.可能会不同.
g_lbz 2006-11-03
  • 打赏
  • 举报
回复
看过了各位的高见
我觉得也不等价,主要是益处的问题了
jianshi051 2006-11-03
  • 打赏
  • 举报
回复
学习了!~
mczxm 2006-11-03
  • 打赏
  • 举报
回复
我认为是不等的了如上面所说的这两个数可能为负
frankinbj 2006-11-03
  • 打赏
  • 举报
回复
还真没考虑这个问题
BrightLiuW3 2006-11-03
  • 打赏
  • 举报
回复
/*
Name: BrightLiuW3
Copyright:
Author:
Date: 03-11-06 06:42
Description:
个人看法, 不足和错误的地方请大家纠正...学习...
不要扔石头...
*/

#include <iostream>
#include <math.h>

using namespace std;

int main()
{
char x, y, z;//分配一个字节存储整数...为了方便 :) ... (-128 - 127)
x = 127;
y = -128;

cout<<static_cast<int>(x)<<endl;
cout<<static_cast<int>(y)<<endl;

z = y - x;
cout<<static_cast<int>(z)<<endl; // z = 1; z > 0; (y > x???) 溢出???

z = x - y;
cout<<static_cast<int>(z)<<endl; // z = -1; z < 0; (x < y???) 溢出...

//牵扯到溢出的情况...较难判断...一般应控制所有变量在其范围之内...
//有时候结果虽然不对...但是也不一定溢出啊...都是边界犯的错???
//z也应该满足: -128<= z <= 127

x = 127;
y = 127;

cout<<(x + y)<<endl; //output: 254 ... 大于127了啊... ???

cout<<fixed<<pow(2, 126)<<endl;//output:85070591730234616000000000000000000000.000000
cout<<fixed<<pow(2, 127)<<endl;//output:
//32位系统中...pow(2, 126)存在常量堆中...最多可分配126bits...(自己试的...)
//故不必担心溢出问题...所以(x + y)输出了254而没有溢出...

//(你会用到如此大的数???你用的着为一个数分配如此大的空间???莫非你想???)
}

// 下面回答lz的问题...
// 我认为应该是等价的...原因是: i - j 存放在堆中...
// 你要是应把i - j的值搞的堆里放不下...那我也没办法了...
// 不过...你既然定义了i 和 j 应该不会超过...堆的范围吧...
// 除非你自己定义的i和j的数据类型...你好强...
maxlcl 2006-11-03
  • 打赏
  • 举报
回复
是的,如果考虑到j是负数的时候,有可能溢出!
加载更多回复(27)

64,676

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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