测试环境: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