IT公司面试题总结(四).docx
试题1:请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,
则返回1
解答:
intcheckCPU()
union w
(
int a;
char b;
}c;
试题1:请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,
则返回1
解答:
intcheckCPU()
union w
(
int a;
char b;
}c;
= 1;
return ( == 1);
)
)
剖析:
嵌入式系统开发者应该对Little-endian和Big-endian模式非常了解。采用Little-endian 模式的CPU对操作数的存放方式是从低字节到高字节,而Big-endian模式对操作数的存放 方式是从高字节到低字节。例如,16bit宽的数0x1234在Little- endian模式CPU内存中的 存放方式(假设从地址0x4000开始存放)为:
内存地址存放内容
0x4000 0x34
0x4001 0x12
而在Big-endian模式CPU内存中的存放方式则为:
内存地址存放内容
0x4000 0x12
0x4001 0x34
32bit宽的数0x12345678在Little-endian模式CPU内存中的存放方式(假设从地址
0x4000开始存放)为:
内存地址存放内容
0x4000 0x78
0x4001 0x56
0x4002 0x34
0x4003 0x12
而在Big-endian模式CPU内存中的存放方式则为:
内存地址存放内容
0x4000 0x12
0x4001 0x34
0x4002 0x56
0x4003 0x78
联合体union的存放顺序是所有成员都从低地址开始存放,面试者的解答利用该特性,
轻松地获得了 CPU对内存采用Little-endian还是Big-endian模式读写
试题2:写一个函数返回1+2+3+...+n的值(假定结果不会超过长整型变量的范围)
解答:
int Sum( int n )
(
return ((long)1 + n) * n / 2; 〃或 return (11 + n) * n / 2;
}
剖析:
对于这个题,只能说,也许最简单的答案就是最好的答案。下面的解答,或者基于下面的解 答思路去优化,不管怎么“折腾”,其效率也不可能与直接return ( 1 I + n ) * n / 2相比!
void swap(int a,int b)
(
a=aAb;
b=bAa;
a=aAb;
)
或者
void swap(int a, int b)
a=a+b;
b=a-b;
a=a-b;
)
不过这两种方法只是修改了函数的形参,如果要修改实参,可以采用如下的方法:
void swap(int* ajnt *b)
(
*a=*aA*b;
*b=*bA*a;
*a=*aA*b;
IT公司面试题总结(四) 来自淘豆网m.daumloan.com转载请标明出处.