每天几道C试题
知识点抄笔记
1、写出float x 与“零值”比较的if语句。
if(x > 0.000001 && x < -0.000001)
2、已知一个数组table,用一个宏定义,求出数据的元素个数。
#define NTBL (sizeof(table) / sizeof(table[0]))
3、对(-1.2345)取整是多少?
参考答案:取整不是四舍五入,而是去掉尾巴。
其实不同的取整函数可能有不同的结果,不过这个数没有太大的争议,答案是==-1==。
4、写一语句实现x是否为2的若干次幂的判断。
参考答案:!(X)&(X-1)
5、请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1
参考答案:
int checkCPU()
{
union w
{
int a;
char b;
} c;
c.a = 1;
return (c.b == 1);
}
剖析:
采用Little-endian模式的CPU对操作数的存放方式是从低字节到高字节,
而Big-endian模式对操作数的存放方式是从高字节到低字节。
举例子:16bit宽的数0x1234
Little-endian存放模式:
内存地址 存放内容
0x4000 0x34
0x4001 0x12
而Big-endian存放模式:
内存地址 存放内容
0x4000 0x12
0x4001 0x34
再来个例子:32bit宽的数0x12345678(假设从地址0x4000开始存放)
Little-endian存放模式:
内存地址 存放内容
0x4000 0x78
0x4001 0x56
0x4002 0x34
0x4003 0x12
而Big-endian存放模式:
内存地址 存放内容
0x4000 0x12
0x4001 0x34
0x4002 0x56
0x4003 0x78
联合体union的存放顺序是所有成员都从低地址开始存放。
*6、有一个如下的结构体:
struct A{
long a1;
short a2;
int a3;
int a4;
};
请问在64位编译器下用sizeof(struct A)计算出的大小是多少?
解析:
32位编译器:32位系统下指针占用4字节
char :1个字节
char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节。同理64位编译器)
short int : 2个字节
int: 4个字节
unsigned int : 4个字节
float: 4个字节
double: 8个字节
long: 4个字节
long long: 8个字节
unsigned long: 4个字节
64位编译器:64位系统下指针占用8字节
char :1个字节
char*(即指针变量): 8个字节
short int : 2个字节
int: 4个字节
unsigned int : 4个字节
float: 4个字节
double: 8个字节
long: 8个字节
long long: 8个字节
unsigned long: 8个字节
Win64下:long 8字节、short 2字节、int 4字节、int* 8字节;
C++中内存对齐,按最大长度对齐:8+(2+4+2(补齐2字节))+8 = 24字节
备注:主要是了解32位和16位系统各种数据类型所占的存储空间
7、写出嵌入式中经常使用的死循环有几种
while (1) {};
for(;;}
__loop
goto loop;
8、volatile 的含义,写出3种使用方式
参考答案:
volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。
如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。
一般说来,volatile用在如下的几个地方:
(1)、中断服务程序中修改的供其它程序检测的变量需要加volatile;
(2)、多任务环境下各任务间共享的标志应该加volatile;
(3)、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义
9、给定一整型变量a写两段代码:第一个设置a的bit3,第二个清除a的bit3
#define BIT3 (0x1 << 3)
static int a;
void set_bit3(void)
{
a |= BIT3;
}
void clear_bit3(void)
{
a &= ~BIT3;
}
备注:写驱动常用到
10、某工程中要设置一个绝对地址为0x67a9整形变量值为0xaa66,编译器是纯ANSI编译器。
int *ptr;
ptr = (int *)0x67a9;
*ptr = 0xaa55;
备注:掌握函数指针的用法
11、sizeof和strlen的区别?
答案:sizeof是运算符,在编译时即计算好了; 而strlen是函数,要在运行时才能计算。
还有对字符串来说,sizeof包含字符串结尾,strlen不包含。
期待下次
keep