这个问题谁能解释下??

lsy888 2006-07-26 11:15:43
#include<iostream>
using namespace std;

int main(){
unsigned int max=100;
int min=-10;
if(min<max) cout<<"min<max"<<endl;

system("pause");
}
//////////////////////////////////////////////////////////

这个程序能输出"min<max"吗?
为什么??
谁能解释下比较大小操作的数据是怎样变化的??
...全文
222 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
jixingzhong 2006-07-26
  • 打赏
  • 举报
回复
操作符总是往类型较小的方向靠拢 ???

我怎么理解是往 大数据 类型转化 ..

int =》 unsigned int
所以这个负数被识别为一个 超大的 unsigned int ...

在 Primer 一书中有这个 混合类型运算过程的默认类型转化次序,
楼主去翻翻看,
几个大的规则还是需要记得的 ...
aronzhou 2006-07-26
  • 打赏
  • 举报
回复
#include<iostream>
using namespace std;

int main(){
unsigned int max=100;
int min=-10;
cout<<(min<max)<<endl;
cout<<(unsigned int)min<<endl;
if(min<max) cout<<"min<max"<<endl;

system("pause");
return 0;
}
操作符总是往类型较小的方向靠拢.
所以-10被转化为一个很大的unsigned int值

dx30611 2006-07-26
  • 打赏
  • 举报
回复

我好象说错了呀
真是羞愧啊
下次要小心了
lsy888 2006-07-26
  • 打赏
  • 举报
回复
to dx30611(mao) :
照你说,(min<max)==true 了,但是没有输也啊??


to jigangwang(wang) :
你说"操作符总是往类型较小的方向靠拢.",
但是 max+min=90,这显然是"unsigned int" 向"int"靠拢啊?在比较操作时为什么不是这样啊??
jigangwang 2006-07-26
  • 打赏
  • 举报
回复
操作符总是往类型较小的方向靠拢.
所以-10被转化为一个unsigned int值
dx30611 2006-07-26
  • 打赏
  • 举报
回复
将unsigned int转化为int,再比较
min是-10,而max是100,当然是min<max了
pigsanddogs 2006-07-26
  • 打赏
  • 举报
回复
signed int 向unsigned int靠拢
但是 max+min=90,这显然是"unsigned int" 向"int"靠拢啊?在比较操作时为什么不是这样啊??

这样是因为做加法的时候是没“符号”这个概念的。
因为不管是否有符号数还是没符号数相加, 结果都一样。
你可以认为这个90是因为一个特别大的数和一个小数相加后,溢出了最高位被计算机抛弃了
还余下90
-10 = FFFFFFF6
100 = 00000064
+
--------------
90 =10000005a
marsogre 2006-07-26
  • 打赏
  • 举报
回复
有符号类型向无符号类型提升
小数据类型向大数据类型转换

假如 int 的取值范围是-32767到-32768
unsigned int 的取值范围是0到65535
那么int min=-10转换为unsigned int min=65525
因为65525是-10对65535求模后的值

如果把-1赋给unsigned char,那么结果是255,因为255是-1对256求模后的值......一个道理
fatweier 2006-07-26
  • 打赏
  • 举报
回复
还是写错了:( mix+max=0xFFFF+0x02=0x0001=1
fatweier 2006-07-26
  • 打赏
  • 举报
回复
没办法,总要有个约定嘛

双目运算符的两个操作数中,值域较窄的类型向值域较宽的类型转换
long double>double>float>unsigned long>long>unsigned>int>char/short
比较运算符的两个操作数类型不同,按算术转换规则自动转换,
min转换为unsigned int型.比较时min=0xFFF6(假设int为2字节,呵呵,应该没算错,错也差不了很多)0xFFF6>>>>100,所以min<max是false.
min+max也是相应的道理,实在不行,算算就知道了假设int min=-1,unsigned int max=2.
min+max=0xFFFF+0x10=0x0001=1.相同的,你的max+min=90.

唉,是不是太啰嗦了
syzgmsun 2006-07-26
  • 打赏
  • 举报
回复
我用的是VC2005,通不过!
KDE 2006-07-26
  • 打赏
  • 举报
回复
又是有无符号的隐式转换问题。

虽然我很讨厌,但是这种问题式的确存在的。特别是隐式整型提升。

还是那句老话,聪明的编译器会为我们发出警告,我们应该重视编译器发出的每一个警告。

如果您使用的编译器比较“笨”,那么请在对不同类型的数做运算之前,请显示转换。
dx30611 2006-07-26
  • 打赏
  • 举报
回复
对于无double,float,unsigned long int,long int时
如果任何一个操作书为unsigned int类型,则将两个操作数都转换为unsigned int
unsigned int所能够表示的数更大,所以要把int转化为unsigned int
这样解释有些牵强,但是很多书上都是这么写的,包括c++ primer,the c programming language
dx30611 2006-07-26
  • 打赏
  • 举报
回复
以下摘自<<the c programming language>>
关于整型提升:如果原始类型的所有值都可以用int类型表示,则其值将被转换为int类型;否则将被转换为unsigned int类型
jigangwang 2006-07-26
  • 打赏
  • 举报
回复
不好意思,道歉
应该是往大范围的方向转化
short->int->float->double
只是这里谁是大范围还真是不记得.好像tanhaoqiang的c编程语言里边是有描述的.

64,680

社区成员

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

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