Chinaunix首页 | 论坛 | 博客
  • 博客访问: 384399
  • 博文数量: 48
  • 博客积分: 743
  • 博客等级: 上士
  • 技术积分: 956
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-22 13:51
文章分类

全部博文(48)

文章存档

2015年(3)

2014年(17)

2012年(23)

2011年(5)

分类: C/C++

2012-04-09 17:03:01

基本数据类型:
C语言中只有4种基本数据类型——整型浮点型指针构造类型(如数组和结构等);所有其他类型都是从这4种基本类型的某种变化或组合派生而来。
一、整型家族
 整型家族包括charshort intintlong int,并且都分为signedunsigned型。
int型字长问题:
long int型至少应该和int型一样长,而int型至少应该和short int一样长。
 规定int字长和机器字长相同;C/C++
② 操作系统字长和机器字长未必一致;
③ 编译器根据操作系统字长来定义int字长;
   由上面三点可知,在一些没有操作系统的嵌入式计算机系统上,int的长度与处理器字长一致;有操作系统时,操作系统的字长与处理器的字长不一定一致,此时编译器根据操作系统的字长来定义int字长:比如你在64位机器上运行DOS16系统,那么所有for dos16的C/C++编译器中int都是16位的;在64位机器上运行win32系统,那么所有for win32的C/C++编译器中int都是32位的。(CPU的‘字长”是指其一条指令/一次运算可以处理的数据的最大宽度.)
   对于整型的数值范围,每个编译器里面都有一个标准头文件:limits.h,这个头文件定义了一些宏,这些宏表示该编译器使用的所有数据类型的范围,编程过程中使用这些宏就行了。例如你想要的int的最大值可以使用宏INT_MAX,最小值使用INT_MIN,而无符号则可以使用UINT_MAX,还有其它类型的
   整形变量的大小还与编译器有关,在嵌入式系统的编程中,一般整数的位数等于CPU字长,常用的嵌入式CPU芯片的字长为8、16、32,因而整形变量的长度可能是8、 16、32。在未来64位平台下,整形变量的长度可达到64位。

   在数据结构的设计中,优秀的程序员并不会这样定义数据结构(假设为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 charunsigned 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型的交集字符,在进行算术运算时,可根据需要再使用显示地声明或者强制转换。
阅读(4948) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~