您的位置:首页 > 产品设计 > UI/UE

C判断char型和unsigned int型比较大小,LmiQueryCSmd

2017-10-13 00:13 597 查看
昨天面试的最后一题,当时感觉做对了,后来用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++,满足条件还会自增一次
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐