分析2个代码片段(数值范围,类型转换相关)

来源:互联网 发布:网络小精灵粤语 编辑:程序博客网 时间:2024/05/16 05:16

测试环境:VC6.0

#include <stdio.h>int main(void){unsigned short index = 0;unsigned short i = 0;printf("%x\n",index-1);for(i=0;i<index-1;i++)printf("%d\n",i);}
//对于short无符号数index=0,  index-1因为1是有符号int类型,这会发生隐含类型转换
//unsigned short转换为int类型来运算 所以index-1=-1 也就是0xffffffff
//i<index-1  那么0 < -1 不满足条件,跳出循环(猜想在比较的时候i也会发生类型转换)

#include <stdio.h>int main(void){unsigned long index = 0;unsigned short i = 0;//sizeof(unsigned long)  为4字节printf("%x\n",index-1);for(i=0;i<index-1;i++)printf("%d\n",i);}
//对于long无符号数index=0,  index-1因为1是有符号int类型,而index是unsigned long,
//这会发生隐含类型转换
//int转换为unsigned long类型来运算 所以index-1=0xffffffff 被解析为无符号数4294967295
//i<index-1  unsigned short的取值范围[0,65535],而index-1=0xffffffff=4294967295
//i一直加,加到63335还是小于4294967295,然后再加1,那么就会得到i=0,这个循环就无法跳出来


//unsigned short i = 65535;   65535=1111 1111 1111 1111
//i = i + 1                  65535+1 = 1111 1111 1111 1111 + 1 = 1 0000 0000 0000 0000
//因为unsigned short只占2个字节,那么只会取后面的2个字节作为数值也就是0



0 0
原创粉丝点击