从程序的角度分析单片机中用到的常量和变量的数据类型
时间:10-02
整理:3721RD
点击:
前两天面试去,面试官是个做c/c++语言,通信编程的,他问了几个关于单片机用到的数据类型的问题,把我问傻了。做单片机从来没有仔细考虑过这个问题,做了半年了,突然觉着自己白搞了一样。
拿msp430为例:
#define divS0 (0x02) /* SMCLK Divider 0 */
divS0被常数00000010赋值,0x02是char型的吗?那么divS0是什么型的?
再比如:#define CPUOFF (0x0010u)
0x0010u是无符号整形的吧,那么CPUOFF是什么型的?接着如下
#define LPM0 (CPUOFF)
那么定义的LPM0又是什么类型的?
从前知识照着demo去编写程序,确没有从软件的角度去分析过,有没有牛人过来指点一下?
拿msp430为例:
#define divS0 (0x02) /* SMCLK Divider 0 */
divS0被常数00000010赋值,0x02是char型的吗?那么divS0是什么型的?
再比如:#define CPUOFF (0x0010u)
0x0010u是无符号整形的吧,那么CPUOFF是什么型的?接着如下
#define LPM0 (CPUOFF)
那么定义的LPM0又是什么类型的?
从前知识照着demo去编写程序,确没有从软件的角度去分析过,有没有牛人过来指点一下?
我觉得宏定义只是名称和数值,具体类型与实际程序中使用这个宏的位置和编译器有关
对,define相当于替换。但是对于表达式来说,左端为变量,所以它的类型肯定是已经确定的了,那么给寄存器赋值时或许会有个类型的强制转换,但是寄存器在厂商或者编译平台中是怎么定义的呢?
个人理解:编译平台通常都是有针对性对某些MCU编程,比如在建立工程文件前需要选择MCU型号等,这一过程也许就已经将MCU的各个寄存器地址的寄存器类型已做了预处理,比如32位、16位还是8位。寄存器赋值都是无符号数的吧,因为有符号数意义不大。
说的太对了,一语点破!
u8、u16~
这一点确实需要注意总结,