前言:
此时小伙伴们对“c语言面试一般问什么”大概比较重视,姐妹们都需要分析一些“c语言面试一般问什么”的相关资讯。那么小编同时在网摘上收集了一些有关“c语言面试一般问什么””的相关文章,希望朋友们能喜欢,咱们快快来学习一下吧!#科技V计划#
C语言常见常用的知识点很多,下面是工作中或者找找工作面试时经常会遇到几个问题。
1、浮点数(float)怎么使用串口通信?怎么拆分?怎么组合恢复?
//定义数据结构
typedef union{
float Data; //定义浮点数据(占4个字节)
struct
{
u8 b1,b2,b3,b4; //顺序不能调整
}Field;
}FloatToByte_t;
//浮点数转换成字节(出来即可通过串口发送)
void TransFloatToBytes(FloatToByte_t InData,u8 *buff)
{
*buff++=InData.Field.b1;
*buff++=InData.Field.b2;
*buff++=InData.Field.b3;
*buff++=InData.Field.b4;
}
//将字节转换为浮点数,从字节回复为浮点数
float TransBytesToFloat(u8 *buff)
{
FloatToByte_t temp;
temp.Field.b1=*buff++;
temp.Field.b2=*buff++;
temp.Field.b3=*buff++;
temp.Field.b4=*buff++;
return temp.Data;
}
测试代码如下
void TestFloatToByte(void)
{
bool equal=FALSE;
u8 i,uBuff[4];
float fInput=0.123456,fOutput;
FloatToByte_t InData;
printf(" --------------------------------- \r\n");
for(i=0;i<10;i++)
{
fInput+=1.01; //待转换浮点数据
InData.Data=fInput;
TransFloatToBytes(InData,uBuff); //浮点数转换为字节
fOutput=TransBytesToFloat(uBuff); //字节转换为浮点数
if(fInput==fOutput)equal=TRUE; //判断转换前后是否相等
else equal=FALSE;
printf(" num=%d fInput=%f fOutput=%f equal=%d\r\n",i,fInput,fOutput,equal);
}
printf(" --------------------------------- \r\n");
}
测试结果如下图
2、如何拆分一个16位变量为两字节?移位法还是除法?结果有什么不同?
u8 B1,B2;
i16 Temp16A=InputData,Temp16B;
//移位法
B1=(u8)(Temp16A>>8);
B2=(u8)Temp16A;
//除法
B1=(u8)(Temp16A/256);
B2=(u8)(Temp16A%256);
//思考以上两个方法的不同(假如用于通信,接收方是否能回复原始数据)
一下是测试功能函数
void TestData(i16 InputData)
{
u8 B1,B2;
i16 Temp16A=InputData,Temp16B;
B1=(u8)(Temp16A>>8);
B2=(u8)Temp16A;
printf(" Temp16A=0x%04X %d\r\n",Temp16A,Temp16A);
printf(" A B1=0x%X B2=0x%X\r\n",B1,B2);
Temp16B=(B1<<8)+B2;
printf(" 移位法恢复数据 Temp16B=0x%04X %d \r\n",Temp16B,Temp16B);
B1=(u8)(Temp16A/256);
B2=(u8)(Temp16A%256);
printf(" A B1=0x%X B2=0x%X\r\n",B1,B2);
Temp16B=(B1*256)+B2;
printf(" 除法恢复数据 Temp16B=0x%04X %d \r\n",Temp16B,Temp16B);
}
输出结果如下图:
由上图可见移位法拆分与恢复数据正确,除法拆分与恢复数据不一致。编程过程中优先使用移位法拆分变量。当然用联合体也可以。
3、如何快速高效的计算一个变量1的个数?不使用循环计算?
const u8 TableOf1InVar[]={0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4};//建立1的数据表
u8 GetU8Number1Amount(u8 Data)//计算8位变量1的个数
{
u8 cnt;
cnt=TableOf1InVar[Data & 0x0F];
cnt+=TableOf1InVar[Data>>4];
return cnt;
}
u8 GetU16Number1Amount(u16 Data)//计算16位变量1的个数
{
u8 cnt;
cnt=TableOf1InVar[(Data>>0) & 0x0F];
cnt+=TableOf1InVar[(Data>>4) & 0x0F];
cnt+=TableOf1InVar[(Data>>8) & 0x0F];
cnt+=TableOf1InVar[(Data>>12) & 0x0F];
return cnt;
}
u8 GetU32Number1Amount(u32 Data)//计算32位变量1的个数
{
u8 cnt;
cnt=TableOf1InVar[(Data>>0) & 0x0F];
cnt+=TableOf1InVar[(Data>>4) & 0x0F];
cnt+=TableOf1InVar[(Data>>8) & 0x0F];
cnt+=TableOf1InVar[(Data>>12) & 0x0F];
cnt+=TableOf1InVar[(Data>>16) & 0x0F];
cnt+=TableOf1InVar[(Data>>20) & 0x0F];
cnt+=TableOf1InVar[(Data>>24) & 0x0F];
cnt+=TableOf1InVar[(Data>>28) & 0x0F];
return cnt;
}
4、如何通过一个函数判断芯片的大小端?是大端返回帧,小端返回假。
typedef union
{
u16 dat;
struct
{
u8 a;
u8 b;
}f;
}MucEndian_t;
bool isBigEnd(u16 data)
{
u8 temp8;
MucEndian_t temp;
temp.dat=data;
temp8=data>>8;
if(temp.f.a==temp8)
return TRUE;
else
return FALSE;
}
5、如何定义一个32位变量其地址指向指定定值?并设置变量值为0x12345678
u32 TestFixVar1 __attribute__((at(0x20000100))) = 0x12345678;
void TestFixVar(void)
{
printf(" X1 TestFixVar=0x%X %X \r\n",(u32)(&TestFixVar1),TestFixVar1);//输出地址与变量的值
TestFixVar1=0x87653421; //更改变量的值
printf(" X2 TestFixVar=0x%X %X \r\n",(u32)(&TestFixVar1),TestFixVar1);//输出地址与变量的值
}
测试结果如下图:
如上图可见,变量定位定义与测试输出一致。
总结:以上就是本次分享的五个C语言基本知识点,希望对大家有用。当然C语言还有很多其他知识点。
标签: #c语言面试一般问什么