目录
上一篇介绍了数据类型的长度和数据范围,并且分别讲解了两个经典的笔试题,这一篇我们再来看三道非常经典的考数据类型长度、数据范围和数据类型转换的笔试题。
说明:我们学过单片机的一般都是有C语言基础的了,网上关于C语言的资料有很多,大家如果对C语言不熟悉的话可以先去详细学一下,再以这篇博文作为复习资料学习。
这篇博文的目的是复习C语言,我们会陆续以30多个编程题作为复习要点,这30多个编程题基本涵盖了C语言所有的内容了,只要你掌握了这30多个编程题,那么你的C语言基本就没什么问题了。
注意:由于本专栏是嵌入式全栈开发专栏,为了我们能熟悉以后实际工作中的开发环境,我们写C语言全部在Linux中的vim编辑器中写,这么做事为了我们能够熟练掌握Linux系统的常用命令以及Linux上的vim编辑器的常用工作命令,以达到对口训练的目的!
vim编辑器的一些工作命令在上一篇博文中已经详细介绍过了,如果不了解可以先去看看。
我们正式开始:
笔试题3
问:
int i = -20;
unsigned int j = 10;
i+j =?
答案:4294967286
为什么呢?
这是一道混合运算,如果你直接填-10,那就是0分不得了。
i是int类型,j是unsigned int类型,在C语言中,不同的数据类型是不能运算的,但是编译的时候没有报错,那是因为当它检测到运算符号两边的数据类型不一样的时候,它会帮我们统一两边的数据类型,即帮我们转换数据类型。
比如,char ch和int num两个变量相加ch+int,我们知道char占1个字节,int占4个字节,如果运算的时候,int转换成char就要丢弃3个字节,那数据就失真了,已经不是原来的数值了,所以int不能转换成char。
这种情况下,char就能够转换成int类型,char补上三个字节
我们得出一个结论:混合运算,把表示范围小的转换成表示范围大的。
那如果说是char和unsigend char,哪一个表示的范围更大呢?
明显是unsigned char的范围更大,因为unsigend char的范围是0~255,而char表示的范围是-128~127。
所以我们再得出一个结论:混合运算,把有符号的转换成无符号的。
因此我们这道笔试题应该这样解:
首先,要知道负数在内存中是以补码的形式出现的。
-20的原码是1000 0000 0000 0000 0000 0000 0001 0100
反码:1111 1111 1111 1111 1111 1111 1110 1011
补码:1111 1111 1111 1111 1111 1111 1110 1100
现在我们要将-20的补码从int型转换成unsigned char型:
补码:1111 1111 1111 1111 1111 1111 1110 1100原来的最高位1是表示符号位,现在既然要转换成无符号的int,那这个最高位的1就不再表示符号了,而是直接带入计算就行了。
我们用计算器算一下这个数多大:
这个数转换成十进制是:4294967276
加上unsigned int 10就是4294967286
那最终这道题的答案就是:4294967286
我们再看一道微软公司的笔试题:
笔试题4
问:
unsigned int a =3;
-1*a=?
答案是:4294967293
-1明显是由符号的数字,a是无符号的数字,所以我们一定是要把-1转换成无符号的数字,然后再进行计算。但是这道题有点刁钻,因为结果已经超出了unsigned int的最大值,最终超出的部分数值要丢弃。
解:
-1的原码是1000 0000 0000 0000 0000 0000 0000 0001
反码:1111 1111 1111 1111 1111 1111 1111 1110
补码:1111 1111 1111 1111 1111 1111 1111 1111
补码转换成无符号的数据,高位的1不再表示符号位,直接计算
12,884,901,885明显超出了unsigned int的最大范围4294967295
所以超出的部分数值要丢弃!
无符号数的原码和补码相等,都是0000 0000 0000 0000 0000 0000 0000 0011,不需要转换!
丢弃了高位的两位10后,得出的结果是4294967293
笔试题5
问:
小数值1.5625的二进制表示是_____(阿里巴巴2015笔试题)
答案是:1.1001
小数部分我们要用到乘2取整法
这些题也希望大家能够牢记,因为这是比较经典的题目,如果你能掌握的话,那今后其他笔试题也能举一反三。
以上就是这篇内容,如想了解更多,欢迎订阅本专栏!
如有问题可评论区或者私信留言,如果想要进交流群请私信!