【基础复习】八:位运算与嵌入编程


位制转换

1.下列程序的输出结果?

#include<iostream>
#include<cstdio>
using namespace std;

int main() {
    printf("%f
", 5);
    printf("%d
", 5.01);
}

解析:
在printf的函数栈中会开辟内存存放参数的。
根据说明符"%f",会认为参数是个double类(在printf函数中,float会自动转换成double)
第一个答案是0.000000
第二个答案是一个大数


2.[C结构体之位域(位段)](http://www.eefocus.com/yw0520205036/blog/13-09/298668_4b313.html)
[c++四种强制类型转换的总结](http://tech.it168.com/a2011/0722/1221/000001221881_all.shtml)

嵌入式编程

  • 一个终端服务子程序ISR不能返回一个值,也不能传递参数

  • 有些处理器/编译器是不能在ISR里做浮点运算的,从效率看也不应该做浮点运算

  • 一般也不在ISR中使用printf函数,考虑效率问题

  • 当一个对象的值可能会在编译器的控制或检测之外被改变时,例如一个被系统时钟更新的变量,那么该对象应该声明成volatile。因为编译器执行的某些例行优化行为不能应用在已指定为volatile的对象上。

  • volatile修饰符的主要目的是提示编译器该对象的值可能在编译器未检测到的情况下被改变,因此编译器不能武断地对引用这些对象的代码做优化处理

-char* p = (char*)malloc(0)p是非空的。但是strlen(p) 为0.

static

在c语言中,static关键字至少有下列几个作用个:

  • 函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值
  • 在模块内的static全局变量可以被模块内所有函数访问,但不能被模块外其他函数访问。
  • 在模块内的static函数只可被这一模块内的其他函数调用,这个函数的使用范围被限制在声明它的模块内
  • 在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份复制
  • 在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量

from《程序员面试宝典》



原文地址:https://www.cnblogs.com/zengyh-1900/p/5249198.html