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

转自: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分)

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

考点一: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++,满足条件还会自增一次

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值