C/C++ 学习笔记:01 题目

每天几道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字节
char1个字节
char*(即指针变量): 4个字节(32位的寻址空间是2^32,32个bit,也就是4个字节。同理64位编译器)
short int : 2个字节
int4个字节
unsigned int : 4个字节
float: 4个字节
double: 8个字节
long: 4个字节
long long: 8个字节
unsigned long: 4个字节
64位编译器:64位系统下指针占用8字节
char1个字节
char*(即指针变量): 8个字节
short int : 2个字节
int4个字节
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值