嵌入式面试题:C 语言核心考点经典例题
引言
在嵌入式系统开发的面试中,常常会考察候选人对 C 语言基础知识的掌握程度。以下将详细分析几道常见的嵌入式面试题,包括解题步骤、涉及的知识点以及相关拓展。
题目 1
main() {unsigned char z=0;unsigned char x=100;unsigned char y=10;z = (~x)*(x|y);printf(" %d\n", z);
}
解题步骤
- 计算
~x:x = 100,其 8 位二进制表示为01100100。- 按位取反运算符
~对x的每一位进行取反操作,得到10011011。在unsigned char类型下,这个二进制数对应的十进制值为155。
- 计算
x | y:x的二进制是01100100,y = 10,二进制为00001010。- 按位或运算符
|会对两个操作数的对应位进行逻辑或运算,即只要对应位中有一个为1,结果位就为1。所以x | y的结果是01101110,对应的十进制值是110。
- 计算
155 * 110并处理溢出:- 先计算
155 * 110 = 17050。 - 由于
z是unsigned char类型,它只能表示 8 位数据,取值范围是0到255。当计算结果超出这个范围时,就会发生溢出。处理方法是对结果进行取模运算,即17050 % 256 = 154。所以最终z的值为154。
- 先计算
涉及知识点
按位运算
按位运算是对二进制位进行操作的运算,常见的按位运算符有:
- 按位取反
~:对操作数的每一位取反,0变为1,1变为0。例如,~01100100得到10011011。 - 按位或
|:对两个操作数的对应位进行逻辑或运算,只要有一个位为1,结果位就为1。如01100100 | 00001010得到01101110。 - 按位与
&:对两个操作数的对应位进行逻辑与运算,只有当两个位都为1时,结果位才为1。例如,01100100 & 00001010得到00000000。 - 按位异或
^:对两个操作数的对应位进行异或运算,相同为0,不同为1。如01100100 ^ 00001010得到01101110。
数据类型转换
在 C 语言中,不同数据类型之间可能会发生转换。分为隐式转换和显式转换:
- 隐式转换:在表达式中,不同类型的数据进行运算时,编译器会自动将它们转换为相同的类型。例如,在
(~x)*(x|y)中,~x和x|y的结果都是unsigned char类型,它们相乘时可能会先隐式转换为int类型进行计算。 - 显式转换:也称为强制类型转换,通过
(类型名)表达式的形式进行。例如,(int)3.14会将3.14强制转换为int类型,结果为3。
无符号字符型溢出
unsigned char 类型是无符号的 8 位整数,其取值范围是 0 到 255。当计算结果超出这个范围时,就会发生溢出。溢出的处理方式是对结果进行取模运算,模为 256。例如,256 溢出后变为 0,257 溢出后变为 1 等。
拓展
按位运算在嵌入式系统中非常有用,常用于寄存器操作、位掩码等。例如,通过按位与和按位或操作可以设置或清除寄存器的某一位。数据类型转换在处理不同精度的数据时也很常见,但要注意隐式转换可能会导致数据丢失。无符号类型溢出在一些需要循环计数的场景中可以利用,例如使用 unsigned char 作为计数器,当计数到 255 后会自动回到 0。
题目 2
int sum(int a) {int c=0;static int b=3;c+=1;b+=2;return(a+b+c);
}
void main() {int i;int a=2;for(i=0;i<5;i++) {printf("%d,", sum(a));}
}
解题步骤
- 分析
c和b的特性:c是局部变量,每次调用sum函数时,c都会被重新初始化为0,然后执行c += 1,所以c的值始终为1。b是静态变量,在函数第一次调用时被初始化为3。静态变量的特点是在程序的整个生命周期内只初始化一次,并且会保留上一次调用结束时的值。每次调用sum函数时,b都会执行b += 2。
- 五次调用
sum(a):- 第一次调用:
b = 3 + 2 = 5,c = 1,a = 2,所以return 2 + 5 + 1 = 8。 - 第二次调用:
b = 5 + 2 = 7,c = 1,a = 2,return 2 + 7 + 1 = 10。 - 第三次调用:
b = 7 + 2 = 9,c = 1,a = 2,return 2 + 9 + 1 = 12。 - 第四次调用:
b = 9 + 2 = 11,c = 1,a = 2,return 2 + 11 + 1 = 14。 - 第五次调用:
b = 11 + 2 = 13,c = 1,a = 2,return 2 + 13 + 1 = 16。
- 第一次调用:
涉及知识点
局部变量
局部变量是在函数内部定义的变量,其作用域仅限于定义它的函数内部。每次调用函数时,局部变量都会被重新创建和初始化。例如,c 就是一个局部变量,每次调用 sum 函数时,c 都会被初始化为 0。
静态变量
静态变量使用 static 关键字修饰,在函数内部定义的静态变量在程序的整个生命周期内只初始化一次,并且会保留上一次调用结束时的值。静态变量的存储位置在静态存储区,而不是栈上。例如,b 就是一个静态变量,第一次调用 sum 函数时初始化为 3,后续调用会保留上一次的值并继续进行操作。
拓展
静态变量在需要保留函数调用状态的场景中非常有用,例如实现计数器、缓存等。但要注意,过多使用静态变量可能会导致程序的可维护性和可测试性下降,因为静态变量的状态在整个程序生命周期内都存在,可能会影响其他函数的执行结果。
题目 3
char str[] = "Hello";
char *p = str;
int n = 10;
printf("%d, %d, %d,", sizeof(str), sizeof(p), sizeof(n));
解题步骤
- 计算
sizeof(str):str是一个字符数组,用来存储字符串"Hello"。在 C 语言中,字符串是以'\0'结尾的字符序列,所以"Hello"实际上包含5个字母和1个结束符'\0',总共6个字符。sizeof运算符返回的是数组占用的内存字节数,所以sizeof(str)的结果是6。
- 计算
sizeof(p):p是一个字符指针,它指向str数组的首地址。在 32 位系统中,指针的大小通常是4字节;在 64 位系统中,指针的大小通常是8字节。这里假设是 32 位系统,所以sizeof(p)的结果是4。
- 计算
sizeof(n):n是一个int类型的变量,在大多数系统中,int类型通常占用4字节,所以sizeof(n)的结果是4。
涉及知识点
sizeof 运算符
sizeof 是一个 C 语言的运算符,用于计算数据类型或变量所占用的内存字节数。它的使用方式有两种:sizeof(类型名) 或 sizeof(表达式)。例如,sizeof(int) 返回 int 类型占用的字节数,sizeof(str) 返回数组 str 占用的字节数。
数组和指针
- 数组:数组是一组相同类型的数据的集合,在内存中是连续存储的。数组名可以看作是指向数组首元素的常量指针,但它和指针还是有区别的。例如,
sizeof对数组操作时返回的是整个数组占用的内存大小,而不是指针的大小。 - 指针:指针是一个变量,它存储的是内存地址。指针的大小取决于系统的位数,32 位系统中指针通常为
4字节,64 位系统中指针通常为8字节。
拓展
sizeof 运算符在动态内存分配、数组操作等方面非常有用。例如,在使用 malloc 函数分配内存时,可以使用 sizeof 来确定需要分配的内存大小。在处理不同大小的数据类型时,要注意 sizeof 的返回值可能会因系统而异。同时,要区分数组和指针的不同,避免在使用时出现混淆。
总结
通过对这几道嵌入式面试题的分析,我们可以看到嵌入式开发中对 C 语言基础知识的要求较高。掌握按位运算、数据类型转换、变量存储类型、sizeof 运算符等知识点,对于解决实际问题和应对面试都非常重要。希望大家通过学习这些内容,能够在嵌入式开发的道路上取得更好的成绩。
相关文章:
嵌入式面试题:C 语言核心考点经典例题
引言 在嵌入式系统开发的面试中,常常会考察候选人对 C 语言基础知识的掌握程度。以下将详细分析几道常见的嵌入式面试题,包括解题步骤、涉及的知识点以及相关拓展。 题目 1 main() {unsigned char z0;unsigned char x100;unsigned char y10;z (~x)*(…...
Axure RP9教程 【数据传输】(页面值传递)| 作用域 :全局变量、局部变量
文章目录 引言作用域:全局变量作用域>局部变量作用域I 基于全局变量实现一个简单的登陆操作设置变量值的交互动作打开链接的交互动作接收并显示变量值注意点see also共享原型引言 全局变量在交互效果作用是页面值传递 作用域:全局变量作用域>局部变量作用域 全局变量…...
IBM Rational Software Architect安装感受及使用初体验
1 安装感受 最近准备用UML 2.0绘制模型图。在读UML创始人之一Grady Booch写的书《Object-Oriented Analysis and Design with Applications》(第3版)1时,发现书中用的UML工具之一为IBM Rational Software Architect(RSAÿ…...
VRRP学习
虚拟路由器冗余技术【三层技术】:网关冗余VRRP设计了VRRP组的概念,在一个 VRRP 组中,多台路由器共同构成一个虚拟路由器。这个虚拟路由器拥有一个虚拟 IP 地址【VRRP-ID默认是8位二进制,范围是0~255,用以标识和区别不同…...
C_内存 内存地址概念
1. 计算机内存的基本概念 计算机的内存(RAM,随机存取存储器)是用来存储程序运行时的数据和指令的地方。内存被划分为许多小单元,每个单元有一个唯一的地址,这些地址从0开始编号。 内存单元:每个内存单元通…...
GPT-5、o3和o4-mini即将到来
原计划有所变更: 关于我们应有何期待的一些零散想法。 深度研究(Deep Research)确实强大但成本高昂且速度较慢(当前使用o3模型)。即将推出的o4-mini在性能上可能与o3相近,但将突破这些限制,让全球用户——甚至免费用户(尽管会有速率限制)——都能用上世界顶级AI研究助…...
C#MVC项目引用Swagger的详细步骤
目录 一、安装Swagger依赖包二、配置Swagger服务三、启用XML注释四、调整启动配置五、验证与访问常见问题解决 以下是基于ASP.NET Core项目集成Swagger的详细步骤(已适配当前项目结构): 一、安装Swagger依赖包 通过NuGet安装 右键点击项目…...
golang 对象池sync.Pool
Golang中的sync.Pool是什么? sync.Pool 是 Go 标准库中提供的一个对象池(Object Pool)实现,用于缓存和复用临时对象,以减少内存分配和垃圾回收(GC)的压力。它的主要特点是: 临时对…...
聚焦AI与大模型创新,紫光云如何引领云计算行业快速演进?
【全球云观察 | 科技热点关注】 随着近年来AI与大模型的兴起,云计算行业正在发生着一场大变局。 “在2025年春节期间,DeepSeek两周火爆全球,如何进行私域部署成了企业关心的问题。”紫光云公司总裁王燕平强调指出,AI与…...
去重新闻数据中重复的正文内容(body 字段),并把唯一的新闻内容保存到一个新的 JSON 文件中
示例代码: import os import json import nltk from tqdm import tqdmdef wr_dict(filename,dic):if not os.path.isfile(filename):data []data.append(dic)with open(filename, w) as f:json.dump(data, f)else: with open(filename, r) as f:data json.l…...
解决前后端时区不一致问题
前后端时区不一致导致: 》数据不显示在前端 》页面显示时间有误 》一些对时间有要求的方法,无法正确执行,出现null值,加上我们对null值有判断/注解,程序就会报错中断,以为是业务逻辑问题,其实…...
有哪些反爬机制可能会影响Python爬取视频?如何应对这些机制?
文章目录 前言常见反爬机制及影响1. IP 封禁2. 验证码3. 请求头验证4. 动态加载5. 加密与混淆6. 行为分析 应对方法1. 应对 IP 封禁2. 应对验证码3. 应对请求头验证4. 应对动态加载5. 应对加密与混淆6. 应对行为分析 前言 在使用 Python 爬取视频时,会遇到多种反爬…...
STL之序列式容器(Vector/Deque/List)
序列式容器 序列式容器包括:静态数组 array 、动态数组 vector 、双端队列 deque 、单链表 forward_ list 、双链表 list 。这五个容器中,我们需要讲解三个 vector 、 deque 、 list 的使 用,包括:初始化、遍历、尾部插入与删除、…...
小试牛刀-抽奖程序
编写抽奖程序 需求:设计一个抽奖程序,点击抽奖按钮随机抽取一个名字作为中奖者 目标:了解项目结构,简单UI布局,属性方法、事件方法,程序运行及调试 界面原型 待抽奖: 点击抽奖按钮&#x…...
Vue 3 中 ref 与 reactive 的对比
Vue 3 中 ref 与 reactive 的对比 Vue 3 中 ref 与 reactive 的对比一、定义和基本使用refreactive 二、响应式原理refreactive 三、适用场景refreactive 四、注意事项refreactive Vue 3 中 ref 与 reactive 的对比 在 Vue 3 中,ref 和 reactive 都是用于创建响应式…...
centos-stream-9上安装nvidia驱动和cuda-toolkit
这里写目录标题 驱动安装1. 更新系统2. NVIDIA GPU安装检查系统是否安装了 NVIDIA GPU2.1 首先,使用以下命令更新 DNF 软件包存储库缓存:2.2 安装编译 NVIDIA 内核模块所需的依赖项和构建工具2.3 在 CentOS Stream 9 上添加官方 NVIDIA CUDA 软件包存储库…...
从 MySQL 切换到国产 YashanDB 数据库时,需要在数据库字段和应用连接方面进行适配 ,使用总结
YashanDB | 崖山数据库系统 - 崖山科技官网崖山数据库系统YashanDB是深圳计算科学研究院完全自主研发设计的新型数据库系统,融入原创理论,支持单机/主备、共享集群、分布式等多种部署方式,覆盖OLTP/HTAP/OLAP交易和分析混合负载场景ÿ…...
【学习笔记】头文件中定义函数出现重复定义报错
目录 错误复现原因解决方案inlinestatic 扩展参考 错误复现 现在有一个头文件 duplicate_define.h 和两个源文件 duplicate_define_1.cpp 和 duplicate_define_2.cpp。 两个源文件都引入了头文件 duplicate_define.h,且在各自的函数中调用了定义在头文件中的全局函…...
游戏开发中 C#、Python 和 C++ 的比较
🎬 Verdure陌矣:个人主页 🎉 个人专栏: 《C/C》 | 《转载or娱乐》 🌾 种完麦子往南走, 感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持!❤️ 摘要: 那么哪种编程语言最适合游戏开发…...
linux上anaconda安装、卸载、及不同用户共享同个anaconda的操作
这里写目录标题 1、anaconda安装2、所有账号可以访问condastep1: 创建文件step2: 追加以下内容:step3: 赋予执行权限:step4: 生效方式: 3、anaconda3的卸载(1)删除安装文件夹(2)在当前终端会话中…...
利用持久变量绕过长度限制 + unicode特性绕过waf-- xyctf 出题人已疯12 复现
本文章附带TP(Thinking Process)! 黑盒查看网站不具有功能,需要审计代码 # 定义/attack路径的路由 bottle.route(/attack) def attack():# 从请求的查询参数中获取payloadpayload bottle.request.query.get(payload)# 检查payload是否存在,长度是否小于25ÿ…...
大数据技术与Scala
集合高级函数 过滤 通过条件筛选集合元素,返回新集合。 映射 对每个元素应用函数,生成新集集合 扁平化 将嵌套集合展平为单层集合。 扁平化映射 先映射后展平,常用于拆分字符串。 分组 按规则将元素分组为Map结构。 归约 …...
DeepSeek 都开源了哪些技术?
DeepSeek作为中国领先的人工智能企业,通过开源策略推动了全球AI技术的普及与创新。以下是其官方公布的主要开源项目及其技术内容、应用场景和社区反馈的详细分析: 1. FlashMLA 技术描述:专为Hopper架构GPU优化的高效MLA(Multi-Layer Attention)解码内核,针对可变长度序列…...
P8754 [蓝桥杯 2021 省 AB2] 完全平方数
题目描述 思路 一看就知道考数学,直接看题解试图理解(bushi) 完全平方数的质因子的指数一定为偶数。 所以 对 n 进行质因数分解,若质因子指数为偶数,对结果无影响。若质因子指数为奇数,则在 x 中乘以这个质因子,保证指…...
ADGaussian:用于自动驾驶的多模态输入泛化GS方法
25年4月来自香港中文大学和浙大的论文“ADGaussian: Generalizable Gaussian Splatting for Autonomous Driving with Multi-modal Inputs”。 提出 ADGaussian 方法,用于可泛化的街道场景重建。所提出的方法能够从单视图输入实现高质量渲染。与之前主要关注几何细…...
0501路由-react-仿低代码平台项目
文章目录 1 react路由1.1 核心库:React Router安装 1.2 基本路由配置路由入口组件定义路由 1.3 导航方式使用 <Link> 组件编程式导航 1.4 动态路由参数定义参数获取参数 1.5 嵌套路由父路由配置子路由占位符 1.6 重定向与404页面重定向404页面 1.7 路由守卫&a…...
MySQL NULL 值处理
MySQL NULL 值处理 引言 在数据库管理系统中,NULL 值是一个非常重要的概念。在 MySQL 中,NULL 值代表未知、不存在或未定义的值。正确处理 NULL 值对于保证数据的准确性和完整性至关重要。本文将详细介绍 MySQL 中 NULL 值的处理方法,包括 …...
OpenAI即将上线新一代重磅选手——GPT-4.1
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
【蓝桥杯】赛前练习
1. 排序 import os import sysn=int(input()) data=list(map(int,input().split(" "))) data.sort() for d in data:print(d,end=" ") print() for d in data[::-1]:print(d,end=" ")2. 走迷宫BFS import os import sys from collections import…...
Windows 系统下用 VMware 安装 CentOS 7 虚拟机超详细教程(包含VMware和镜像安装包)
前言 资源 一、准备工作 (一)下载 VMware Workstation (二)下载 CentOS 7 镜像 二、安装 VMware Workstation(比较简单,按下面走即可) 三、创建 CentOS 7 虚拟机 四、安装 CentOS 7 系统…...
