
C或者C++内置的整数数据类型的长度是很含糊的。这种含糊性会导致难以预料的意外和后果,尤其是在不同CPU和不同编译器之间移植嵌入式代码的时候。
下面是内置的整数类型的基本规则:
- char是8位的或者更长。基本的无限制的char可以缺省为有符号的或者是无符号的;具体选择哪种就要看编译器了。
- short至少是16位的,而且要不大于int的长度。
- int至少是16位的,而且要不小于short的长度。它通常是机器整数的自然长度,典型的是16位或者32位。尽管ANSI的C语言要求int是16位的或者更长,但是有些用于小型处理器的非常规嵌入式编译器允许使用8位的int。
- long不少于int的长度。它通常是32位或者64位的。
下面是两个简单的例子,用来说明这些不确定性所导致的问题。
例一:访问内存映射I/O端口
在下面的例子里,你准备把什么写到内存映射I/O端口去?
char data = 0x80;
unsigned int *port = PORT_ADDR;
*port = data;
其结果要依赖于你的编译器和CPU的架构。下面是一些可能性:
- 将0x0080写到一个16位的内存映射端口。
- 将0xFF80写到一个16位的内存映射端口。
- 将0xFFFFFF80写到一个32位的内存映射端口。
- 将0x00000080写到一个32位的内存映射端口。
上面这些情况可能会将错误的数据位写入到目标I/O端口,还可能写到相邻的端口。