c语言unsigned short数据类型问题

unsigned short i=0,a=0,b=0;
if(i<a-1)printf("aa\n");
b=b-1;
if(i<b)printf("bb\n");

VC6中结果为bb;
问题:为什么b=b-1;先独立出来就行,直接if(i<a-1)就不行。在i<a-1中计算机是怎样比较这两个数大小的。

因为a-1和b-1的问题,
因为a-1和b-1的结果都为int型,结果都为-1,十六进制为:0xffffffff,而if(i<a-1)printf("aa\n");是直接比较,此时i=0,a-1=-1,所以不满足条件。
而b就不一样,将b-1的值-1又赋值给b,e而b只有16位,所以去b-1的低16位即0xffff给b,而b又是无符号类型,所以b为65535,再和i比较,就比i大了,符合条件。
在微软的visual studio工具中直接查看运行时的汇编代码就一切都明白了
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-11-24
a-1 的结果类型为int,不是你想的unsigned short。两数的操作以较大的数的类型为结果,而1是int类型的。
b-1结果也是int的,只是你赋值给unsigned short 的了时发生了截断。本回答被提问者和网友采纳
相似回答