转自:http://www.jeepxie.net/article/307272.html
昨天面试的最后一题,当时感觉做对了,后来用VC编译发现还是有问题-_-||,好吧,看来这就是没有offer原因
原题:
#define MaxCount 200
int LmiQueryCSmd(void)
{
char Num1 = 0;
unsigned int Num2;
Num2 = Max;
while(1)
{
if(Num1++ > Num2)
{
printf("%d\n",Num1);
break;
}
}
return 0;
}
问题:下面的程序怎么运行,为什么???(10分)
考点一:char、unsgined char 、int等这些类型取值范围
考点二:数据在计算机中是以补码的形式存储
考点三:不同类型的数值比较,都是要先转化为同样类型的数值,然后再比较。signed型会默认变成unsigned型,小字节会默认变成大字节类型
如:unsigned char和char比较,两者会默认是unsigned类型。
char型(1字节)和int型(4字节)的数值比较大小时,char类型(1字节)的数值会默认转换为int类型(4字节),两者再比较。
那么char与 int的转化规则是什么:
①:char转换为int(unsigned int) 型,转化为int 的高三个字节都是以char的符号位(最高位)去填充,例如:
char 为 -127 :1000 0001
转化为int/unsgined int 的 -127:1111 1111 1111 1111 1111 11111 1000 0001
②:unsigned char转换为int(unsigned int) 型,转化为int 的高三个字节都是以 0 去填充,例如:
unsigned char 为 129:1000 00001
转化为int/unsgined int 129:0000 0000 0000 0000 0000 0000 1000 0001
不得不说,多么巧妙的规则
回到题目里面:
1、unsigned int 的Num2 为200 则在内存中表示是:
Num2 :0000 0000 0000 0000 0000 0000 1100 1000 b
2、char类型的Num1 为0则再内存中表示是:
0000 0000 b
3、Num1 每次和 Num2 比较完再自增
①、Num1 先从char型,转化为int型再以unsigned int的类型
0000 0000 0000 0000 0000 0000 0000 0000 b
②、Num1自增
0000 0001 b
一直循环128次
Num1自增 变成 1000 0000 b,比较时候Num2 ,转化为unsigned int的类型:
(unsigned int)Num1 :1111 1111 1111 1111 1111 1111 1000 0000 b
很明显大于 Num2!
4、Num1 大于Num2满足条件, Num1(char)现在是:1000 00001。打印“ -127”(取反加1) ,退出循环。
注意:Num1++,满足条件还会自增一次