面试每日总结(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>

 2 #include <stdlib.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 }

 

 

这个就是正常的方法了,不过还有强人发了另外一种方法,这里我也记录下来:

 

 1 int checkCPU() 
 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模式读写。

 

 

 

 

posted @ 2010-03-31 13:53  一方净土  阅读(260)  评论(0编辑  收藏  举报