Ø
基本数据类型
C
语言中只有
4
中基本数据类型——整型、浮点型、指针和聚合类型(如数组和结构等);所有其他类型都是从这
4
种基本类型的某种变化或组合派生而来。
一、整型家族
整型家族包括
char
、
short int
、
int
和
long int
,并且都分为
signed
和
unsigned
型。
int
型字长问题:
long int
型至少应该和
int
型一样长,而
int
型至少应该和
short int
一样长。
①
C/C++
规定
int
字长和机器字长相同;
②
操作系统字长和机器字长未必一致;
③
编译器根据操作系统字长来定义
int
字长;
http://www.programfan.com/club/showbbs.asp?id=145906
由上面三点可知,在一些没有操作系统的嵌入式计算机系统上,
int
的长度与处理器字长一致;有操作系统时,操作系统的字长与处理器的字长不一定一致,此时编译器根据操作系统的字长来定义
int
字长:“比如你在
64
位机器上运行
DOS16
系统,那么所有
for dos16
的
C/C++
编译器中
int
都是
16
位的;在
64
位机器上运行
win32
系统,那么所有
for win32
的
C/C++
编译器中
int
都是
32
位的”。(
CPU
的
“
字长
”
是指其一条指令
/
一次运算可以处理的数据的最大宽度。
http://www.cublog.cn/u/23458/showart.php?id=175995
)
另外,对于整型的数值范围,每个编译器里面都有一个标准头文件:
limits.h
,这个头文件定义了一些宏,这些宏表示该编译器使用的所有数据类型的范围,编程过程中
使用这些宏就行了。例如你想要的
int
的最大值可以使用宏
INT_MAX
,最小值使用
INT_MIN
,而无符号则可以使用
UINT_MAX
,还有其它类型
的。你自己把这个头文件打开看看就知道了。
附:关于
“
整形变量为
32
位
”
的问题的剖析:
http://bbs.cpcw.com/viewthread.php?tid=666146
整形变量是不是
32
位这个问题不仅与具体的
CPU
架构有关,而且
与编译器有关。在嵌入式系统的编程中,一般整数的位数等于
CPU
字长,常用的嵌入式
CPU
芯片的字长为
8
、
16
、
32
,因而整形变量的长度可能是
8
、
16
、
32
。在未来
64
位平台下,整形变量的长度可达到
64
位。
长整形变量的长度一般为
CPU
字长的
2
倍。
在数据结构的设计中,优秀的程序员并不会这样定义数据结构(假设为
WIN32
平台):
typedef struct tagTypeExample
{
unsigned short x;
unsigned int y;
}TypeExample;
他们这样定义:
#define unsigned short UINT16 //16
位无符号整数
#define unsigned int UINT32 //32
位无符号整数
typedef struct tagTypeExample
{
UINT16 x;
UINT32 y;
}TypeExample;
这样定义的数据结构非常具有通用性,如果上述
32
平台上的数据发送到
16
位平台上接收,在
16
位平台上仅仅需要修改
UINT16
、
UINT32
的定义:
#define unsigned int UINT16 //16
位无符号整数
#define unsigned long UINT32 //32
位无符号整数
几乎所有的优秀软件设计文档都是这样定义数据结构的。
char
型与程序可移植性:
char
类型变量在本质上是小整型值。
字符型(
char
型)也分
signed char
和
unsigned char
型,如果在定义变量时只使用关键字
char
,缺省情况下它根据编译器的定义为
signed char
或
unsigned char
,这意味着不同机器上的
char
可能有不同的取值范围。因此,只有当程序使用的
char
型变量的值位于
signed char
和
unsigned char
的交集中(例如编译器认为
char
为
8
位二进制长时,这个交集是
0~127
,
ASC
Ⅱ字符集的字符都在这个范围内),这个程序才是可移植的。
进一步,如果显示地将字符变量声明为
signed
或
unsigned
,则可提高程序的可移植性,不过,有些机器处理
signed char
和
unsigned char
的能力是不同的,硬性规定后可能会使效率受损,还有不少处理字符的库函数的参数声明为
char
,因此显示声明也可能会有兼容性问题。
结论
:保证可移植性的最佳办法还是定义为
char
型同时只使用
signed char
和
unsigned char
型的交集字符,在进行算术运算时,可根据需要再使用显示地声明或者强制转换。