芯原股份 - 嵌入式软件工程师 - 笔试

❗❗如果本文对您有帮助,请不要吝啬您的评论、点赞、收藏与小花,这对我非常重要!谢谢!❗❗

alt

本文所涉及的题目均为基于个人学习和理解重新表述的内容,仅供学习交流之用,不代表任何实际考试题目。如有雷同,纯属巧合。

岗位:嵌入式软件工程师(成都)

题型:2 道企业知识题,5 道智力题,10 道 C/C++ 单选题(英语),10 道计算机科学及应用单选题(英语),总分 100 分,考试时间 60 分钟

1、企业知识题

1.1

芯原商业模式 SiPaaS 中第二个 S 指的是?==(C)==

  1. Solution
  2. Silicon
  3. Service
  4. Series

1.2

芯原的企业文化是?==(B)==

  1. 公正、友爱、分享、快乐
  2. 公正、关爱、分享、快乐
  3. 诚信、关爱、分享、快乐
  4. 平等、关爱、分享、快乐

2、智力题

2.1

把下面的六个图形分为两类,使每一类图形都有各自的共同特征或规律,分类正确的一项是:==(A)==

Click to view image

  1. ①②④,③⑤⑥
  2. ①②⑤,③④⑥
  3. ①②⑥,③④⑤
  4. ①④⑤,②③⑥

2.2

根据规律,括号中的数字应为:3,16,45,96,==(B)==,288

  1. 145
  2. 175
  3. 195
  4. 105

2.3

左边给定的是纸盒外表面的展开图,右边哪一项能由它折叠而成?==(B)==

Click to view image

  1. B
  2. C
  3. D
  4. A

2.4

某种品牌的汽车轮胎,如果安装在前轮,那么行驶 300km 后报废;如果安装在后轮,那么行驶 450km后报废。如果行驶一定路程后交换前后轮胎,请问四只新轮胎最多可用来行驶多少km?==(C)==

  1. 320
  2. 340
  3. 360
  4. 300

2.5

一位酒商有 6 桶葡萄酒和啤酒,容量分别为 30 升、32 升、36 升、38 升、40 升、62 升。其中五桶装着葡萄酒,一桶装着啤酒。第一位顾客买走了两桶葡萄酒;第二位顾客所买葡萄酒则是第一位顾客的两倍。请问,哪一个桶里装着啤酒?==(D)==

  1. 36 升的桶
  2. 38 升的桶
  3. 40 升的桶
  4. 62 升的桶
  5. 32 升的桶
  6. 30 升的桶

3、C/C++(英语)

3.1

Suppose running on Linux, which one is the correct output of following code ==(C)==

#include <stdio.h>

void test1(void) {
    char* my_array = "abc";
    my_array[1] = '+';
    printf("my array is %s ", my_array);
}

void test2(void) {
    char my_array[] = "abc";
    my_array[1] = '-';
    printf("my array is %s ", my_array);
}

int main(int argc, char** argv) {
    test2();
    test1();
    return 0;
}
  1. my array is a+b my array is a-b
  2. my array is a-b my array is abc
  3. my array is a-c Segmentation fault(core dump)
  4. my array is a-b my array is a+b

解答:

test1() 中定义了一个 my_array 指针,且该指针指向了 "abc" 字符串常量,当尝试修改字串常量的值时会产生段错误
test2() 中定义了一个 my_array 字符数组,可以正常修改数组中某个元素的值,不会产生错误

3.2

Which one is the correct output of following code ==(B)==

#include <stdio.h>

int main(int argc, char *argv[]) {
    unsigned int a = 100;
    signed int b = -100;
    signed int c, d;

    c = a / b; // 这里会导致未定义行为
    d = b / a;

    printf("%d, %d\n", c, d);
    return 0;
}
  1. 0, -1
  2. 0, 42949671
  3. -1, 42949671
  4. -1, -1

解答:

a 是无符号整型数,b 是有符号整型数,当尝试 a / b 的运算时,b 会产生隐式类型转换,转换为无符号整数(4294967196),因此 c 应该为 100/4294967196=0
同理,当尝试 b / a 的运算时,b 仍然会产生隐式类型转换,因此 d 应该为 4294967196/100=42949671

3.3

Which one is the correct output of following code ==(C)==

#include <stdio.h>

static int FIX_HEAD = 6;

int main(int argc, char *argv[]) {
    char array[] = "hello verisilicon";
    int offset = sizeof(array);

#ifdef FIX_HEAD
    offset = FIX_HEAD;
#endif

    printf("%s\r\n", array + offset); 
    return 0;
}
  1. verisilicon
  2. hello veris
  3. messed code
  4. ello verisilicon

解答:

#ifdef FIX_HEAD 用来判断是否存在 FIX_HEAD 宏定义,由于 static int FIX_HEAD = 6; 只是定义了一个变量,而非宏定义,因此虽然同名,但仍然不满足 #ifdef FIX_HEAD 条件,所以 offset 值为 sizeof(array)
array 为字符串首地址,sizeof(array) 为字符串在内存中占用的字节数(包括结束符 \0),因此最终输出结果应该为字符串后的值,也即乱码值

3.4

What's the output of following code ==(A)==

#include <iostream>

int f(int);

using namespace std;

int main() {
    int a = 2, i;
    for (i = 0; i < 3; i++) {
        cout << f(a) << " ";
    }
    cout << endl;

    return 0;
}

int f(int a) {
    int b = 0;
    static int c = 3;
    b++;
    c++;
    return (a + b + c);
}
  1. 7 8 9
  2. 7 10 13
  3. 7 9 11
  4. 7 7 7

解答:

首先应该明确的是:ab 为普通变量,c 则为静态变量,依次按顺序执行了三次 f(2)
第一次执行 f(a) 函数执行到 return (a + b + c); 语句时:a=2b=1c=4,输出 7
第二次:a=2b=1c=5,输出 8
第三次:a=2b=1c=6,输出 9

3.5

What is the output of the following program on a 64-bits machine? ==(B)==

#include <iostream>
using namespace std;

class A {
public:
    int a;
    static int b;
    char c;
    double d;

    virtual int add(int x, int y) { return x + y; }
};

int main() {
    cout << sizeof(A) << endl;
    return 0;
}
  1. 21
  2. 24
  3. 32
  4. 16

解答:

静态成员变量 b 在类的对象中不占用内存,存在虚函数的类会包含一个虚函数指针,指针在 64 位机器上占用 8 个字节内存
在 64 位机器上默认进行 8 字节对齐,剩下的成员变量 acd 在内存中分布为:a(4字节)+ c(1字节)+ 填充(3字节)+ d(8字节)= 16字节,综上共 24 字节

3.6

What's the output of following code ==(B)==

#include <stdio.h>
#include <stdint.h>

uint32_t a = 10;

void func(uint32_t **out) {
    *out = &a;
    a = 20;
}

int main(void) {
    uint32_t *out = 0;
    func(&out);
    printf("%u\r\n", *out); 
    return 0;
}
  1. 10
  2. 20
  3. 无法运行
  4. 0

解答:

outuint32_t 类型的指针,func 函数将指针 out 的地址作为形参传入,在函数体内修改指针指向的值为全局变量 a,同时又修改全局变量 a 的值为 20,因此最终输出的是 a 的值 20

3.7

Running the follow

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

欢迎来到我的专栏,在这里,我将整理并分享2024年各大企业的真实笔试/面试真题,同时还整理了嵌入式软件相关的八股知识。专栏内容涵盖C/C++基础、嵌软常见通信协议、ARM、FreeRTOS、Linux OS相关问题汇总,希望能帮助求职者了解考试趋势和嵌入式常见考点。无论你是准备面试,还是希望提升自己的专业知识,这里都能为你提供宝贵的参考和学习资源。

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务