C语言,下面那段程序怎么得出这样的结果

#include<stdio.h>void main(){unsigned int i=1;unsigned int j=2;printf("0x%08x\n",i-j);
if(i-j>0){ printf("%d>%d",i,j);}else{ printf("%d<=%d",i,j);}}

1、前面的“0x”输出还是0x,表示输出的数是十六进制而已,后面的08x中x表示值i-j是按十六进制输出的,08意思是指定数据最小输出长度为8,不够8位则补零,大于8位按照原位数输出。
2、第二个结果是因为unsigned类型相减会发生溢出,小的减大的结果大于0
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-10-16
计算机里的数字常量,都是以补码形式存放的,
正数的补码是其本身,负数的补码是先取反再加1,
ffffffff这个数,如果你定义的是有符号变量,那么表示-1,但你定义的是无符号变量,那么就表示十六进制ffffffff。
我拿钟表的时间打比方。以0点时表针的角度为0。那么,11点,如果用无符号数的眼光来看,就是330°,是11点。如果以有符号数的眼光看,就是-30°,是-1(0-1)点。
你定义的是无符号数,那么相减结果自然是一个无符号的大数 FFFFFFFF(4,294,967,295
),自然是大于0的,所以就进了第一个分支,显示的是“>”号。

修改的方法是定义有符号数,把un去掉或者直接int。这样,FFFFFFFF就表示为-1的补码,或者说第一行就直接给你换算过来显示-1,第二行也因为-1小于0而进入else分支了。

说白了,你这是溢出的问题,是向下的溢出
第2个回答  2013-10-16
0xffffffff表示的是-1的十六进制
至于下面那个1>2则很明显是,i和j都是unsigned,相减之后得出的值用十进制表示就是4,294,967,295,当然进了else分支
第3个回答  2013-10-16
#include<stdio.h>
#include<process.h>
void main()
{
unsigned int i=1;
unsigned int j=2;
printf("0x%08x\n",i-j);
if(i-j>0)
{
printf("%d>%d",i,j);
}
else
{
printf("%d<=%d",i,j);
}
system("pause");
}
按照我的算法试试!