龙空技术网

找工作、面试极可能遇到的五个C语言知识点

西小岑 227

前言:

此时小伙伴们对“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语言面试一般问什么