您的位置:首页 > 编程语言

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

2015-05-15 12:35 435 查看
测试环境: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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: