C判断char型和unsigned int型比较大小,LmiQueryCSmd
2017-10-13 00:13
597 查看
昨天面试的最后一题,当时感觉做对了,后来用VC编译发现还是有问题-_-||,好吧,看来这就是没有offer原因
原题:
问题:下面的程序怎么运行,为什么???(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++,满足条件还会自增一次
原题:
#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++,满足条件还会自增一次
相关文章推荐
- 2-2-3 嵌套和级联的判断-比较数的大小(从2个数比较到3个数)?
- js 日期比较大小,js判断日期是否在区间内,js判断时间段是否在另外一个时间段内
- 用Groovy实现判断两个int数值大小(不用比较运算符,考虑溢出)
- NSString基础1-创建、长度、比较、判断大小、转换
- 不使用条件判断和比较运算符来比较大小
- Shell脚本 字符串大小比较 字符串是否相等比较 字符串是否为空判断
- 关于velocity比较大小和判断空
- 位运算之不使用任何比较判断比较两个数大小问题
- 技术型:char型数据是如何比较大小的字符型char
- 不用比较运算符,判断int型的a,b两数的大小,考虑溢出问题
- 1.C语言比较大小,闰年判断,火柴游戏设计
- 不用任何比较操作判断正整数a和b的大小
- shell if 多条件判断 时间大小比较
- 不用比较运算符,判断int型的a,b两数的大小
- 不用运算符,比较来那个int型数值的大小
- 不用比较运算符,判断int型的a,b两数的大小的答案
- JS时间戳比较大小:对于一组时间戳(开始时间~结束时间)和另一组时间戳进行比较,用于判断被比较时间戳组是否在要求范围内
- 定义一个宏,不用if switch > < 等任何判断语句 比较a和b的大小
- Java日期操作方法工具类实例【包含日期比较大小,相加减,判断,验证,获取年份等】
- Shell脚本 字符串大小比较 字符串是否相等比较 字符串是否为空判断