嵌入式全栈开发学习笔记---C语言笔试复习大全3

目录

笔试题3

笔试题4

笔试题5


上一篇介绍了数据类型的长度和数据范围,并且分别讲解了两个经典的笔试题,这一篇我们再来看三道非常经典的考数据类型长度、数据范围和数据类型转换的笔试题。

说明:我们学过单片机的一般都是有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取整法

这些题也希望大家能够牢记,因为这是比较经典的题目,如果你能掌握的话,那今后其他笔试题也能举一反三。

以上就是这篇内容,如想了解更多,欢迎订阅本专栏!

如有问题可评论区或者私信留言,如果想要进交流群请私信!

相关推荐
二十雨辰3 分钟前
[linux]docker基础
linux·运维·docker
可峰科技5 分钟前
斗破QT编程入门系列之二:认识Qt:编写一个HelloWorld程序(四星斗师)
开发语言·qt
饮浊酒41 分钟前
Linux操作系统 ------(3.文本编译器Vim)
linux·vim
lihuhelihu1 小时前
第3章 CentOS系统管理
linux·运维·服务器·计算机网络·ubuntu·centos·云计算
矛取矛求1 小时前
Linux系统性能调优技巧
linux
One_Blanks1 小时前
渗透测试-Linux基础(1)
linux·运维·安全
Perishell1 小时前
无人机避障——大疆与Airsim中的角速度信息订阅获取
linux·动态规划·无人机
爱吃喵的鲤鱼1 小时前
linux进程的状态之环境变量
linux·运维·服务器·开发语言·c++
dessler2 小时前
Linux系统-ubuntu系统安装
linux·运维·云计算
scan12 小时前
单片机串口接收状态机STM32
stm32·单片机·串口·51·串口接收