面试每日总结(3月30日)
开始找工作了,去面试的过程暴露了自己的很多问题,因此打算总结一下,毕竟这个也是一个学习的过程。
这次面试的是潮流网络,职位是嵌入式开发工程师,之前没有做过这个,不过面试题目还好,下面我把还记得的题目列举出来大家参考下,都是比较基础的题目。
1.用宏定义2个数a b的比较结果,返回小的那个。
2. 也是比较基本的就是一堆让你写数组和指针的声明。
3.写代码,获取键盘输入2个浮点数,再打印出它们的积。
4.给你一个整形数a,写出改变a的bit 3的操作和清楚bit 3的操作。
5. volatile的作用是什么,因为是做嵌入式的,可能有些作用我不知道。
6.指针和数组的区别?用一个声明反应他们的区别,还有一问忘记了。
7.linux的socket和windows下的WinSock的共同点是什么,从C++的角度说出最少3点他们的区别。
8.你看过的5本C方面的书以及简评。
9.如何判断一个板子是big-endian还是little-endian?判断出结果后如何转换,写出2个转换函数。
大概就这么多题目吧,可能漏了2个我自己也没什么印象了,基本比较基础,只是最后一个平时没有怎么接触到,判断大小端我倒是知道,但是写出转换函数倒没有写过,因为没有做过嵌入式,只是在网络传输中间了解这方面的东西,socket本身提供了函数来转换,因此一时没有想起来怎么解决,查找资料后了解了下,这里详细解答一下,留作自己的记录。
1 #include <stdio.h>
3 #include <assert.h>
4 int main(void)
5 {
6 unsigned short int i = (unsigned short int)0XFF01;
7 assert(sizeof(short int) >= 2); // 判断具体编译器设定的short int类型的长度
8 if (*((char *)&i) == 1)
9 printf("Little-Endian: 数据的低字节部分存储在内存的低地址处\n");
10 else
11 printf("Big-Endian: 数据的低字节部分存储在内存的高地址处\n");
12 system("pause");
13 return 0;
14 }
这个就是正常的方法了,不过还有强人发了另外一种方法,这里我也记录下来:
2 {
3 {
4 union w
5 {
6 int a;
7 char b;
8 } c;
9 c.a = 1;
10 return (c.b == 1);
11 }
12 }
剖析:
嵌入式系统开发者应该对Little-endian和Big-endian模式非常了解。采用Little-endian模式的CPU对操作数的存放方式是从低字节到高字节,而Big-endian模式对操作数的存放方式是从高字节到低字节。例如,16bit宽的数0x1234在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:
内存地址 0x4000 0x4001
存放内容 0x34 0x12
而在Big-endian模式CPU内存中的存放方式则为:
内存地址 0x4000 0x4001
存放内容 0x12 0x34
32bit宽的数0x12345678在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:
内存地址 0x4000 0x4001 0x4002 0x4003
存放内容 0x78 0x56 0x34 0x12
而在Big-endian模式CPU内存中的存放方式则为:
内存地址 0x4000 0x4001 0x4002 0x4003
存放内容 0x12 0x34 0x56 0x78
联合体union的存放顺序是所有成员都从低地址开始存放,利用该特性,轻松地获得了CPU对内存采用Little-endian还是Big-endian模式读写。