嵌入式笔试刷题(第57天)
1. 宏定义:写一个宏定义,输入两个参数并返回较小的一个。
答案:
#define MIN(a, b) ((a) < (b) ? (a) : (b))
分析:使用三目运算符实现条件判断。宏要加括号确保表达式不出错,防止运算优先级导致意外行为。
2. 结构体和联合体:输出是什么?并说明原因。
题目:
union { int i; struct { char first; char second; } half; } number; number.i = 0x4241; printf("%x%x\n", number.half.first, number.half.second); number.half.first = 97; number.half.second = 98; printf("%x\n", number);
答案:输出依赖于字节序。以小端机器为例:
- number.i = 0x4241;内存表示为:41 42 00 00所以:first = 0x41,second = 0x42输出为:4142
- 设置 first = 97 (0x61), second = 98 (0x62)内存变为:61 62 00 00输出的 number.i 为:0x6261
最终输出:
4142 6261
3. 关键字 volatile 有什么用?可以和 const 同时用吗?
答案:
volatile
告诉编译器该变量可能在程序之外被改变(如中断、寄存器、共享内存等),不要优化读取。const
表示变量只读,不能被程序修改。
可以同时使用,表示只读但可能被外部修改的变量,常用于读取只读硬件寄存器。
例如:
const volatile int *reg = (int*)0xFFFF0000;
4. 浮点数:-12.75 的单精度浮点在内存中十六进制表示是多少?
答案:将 -12.75 转换为 IEEE 754 单精度浮点:
- 符号位:1
- 整数部分 12:1100
- 小数部分 0.75:.11 => 二进制为:
1100.11
=1.10011 × 2^3
计算字段:
- 指数位:127 + 3 = 130 =
10000010
- 尾数:10011000000000000000000
组合后为:
1 10000010 10011000000000000000000 => 0xC1500000
5. Linux 命令:创建目录 myfolder 并设置权限为:仅所有者可读写
答案:
mkdir myfolder chmod 600 myfolder
6. 代码错误分析:
void printf_base16(unsigned long num) { char* buf; unsigned long temp; int i = 0; while(num > 0) { temp = num % 16; num = num / 16; if(temp > 9) buf[i++] = temp - 9 + 'A'; else buf[i++] = temp; } while(i) {
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
嵌入式笔试专栏 文章被收录于专栏
本专栏系统整理了嵌入式方向笔试中常见的知识点和高频考题,涵盖基础理论、常用算法、C语言陷阱、操作系统原理、驱动开发、常见外设通信协议(如 I2C/SPI/UART)、RTOS、Linux 内核、以及实用电路知识等内容。