嵌入式笔试刷题(第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 内核、以及实用电路知识等内容。

全部评论

相关推荐

牛客815478225号:找实习,运气成分起码占7成
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务