< 笔记一、数据类型 >
现在业界普遍认可以下等式
程序 = 数据结构 + 算法 + 文档
这第一篇笔记就只对以上提到的数据结构结合本人的理解展开做些总结。
类型
程序的输入输出的实体就是数据信息,而对这些数据信息给以归类和组织,我们就称为数据结构。因此数据结构就是对数据的组织形式,也可以说是对内存的编码规则。由于基于底层的数据都是二进制的 0 、 1 序列,所以人们通常将 8 个连续的 0 、 1 序列看作一个独立的结构——字节( Byte ),字节中的每一个二进制序列就是一个位( bit )。但是这种组织形式太过笼统,为此 C 语言提供了四种基本类型(整型、浮点型、字符型、枚举类型)、三种构造类型(数组、结构体、联合体)、指针类型和空类型。 C++ 语言在以上 9 种类型基础上又增加了一种基本类型—— bool 型和一种构造类型——类类型( class )。
编码规则
虽然 C 数据类型有 9 种 C++ 有 11 种,但是按编码规则所有数据类型却只采用了两种编码方式,即整型和浮点型。以下对各类型结合编码规则稍作展开:
整型数据根据有无符号位可以区分为 signed 和 unsigned 两种类型,对于 signed 的编码方式,最高位用做符号位用,其它位用作数据位,而 unsigned 类型所有位全都用来做数据位。数据位采用补码形式编码,正数的补码以原码给出,而负数的补码为原码的反码加 1 给出,因此 11111111 表示无符号整型时为 255 ,表示有符号整型时为 -1 。 ANSIC 整型类型给出了三种不同字节长度类型符为 short 、 int 、 long ,但 ANSIC 并没有规定每一种类型的具体长度,可以视不同的编译器而变化,但要求 short 不长于 int 不长于 long 。通常 32 位用 VC 编译器编译时 short 为 2 字节、 int 为 4 字节、 long 也为 4 字节。
浮点型数据编码规则不区分有无符号,一致都采用 1 符号位 n 数据位 m 指数位来表示,其中 n 又被称为浮点类型的有效位数, n 越大则精度越高,同时 m 越大表示的数据越大。 ANSIC 给出了不同字节长度的浮点数类型 float 、 double ,同样没有规定每一种类型的具体长度,但要求 float 不长于 double 。 32 位 VC 编译下 float 为 4 字节, double 为 8 字节长度。
字符型,即按 ASCII 码表排序,以单个字节长度采用整型编码方式编码,也要区分 signed 和 unsigned 两种类型。例 char A = 255 和 unsiged char B = 255, 都是表示同一个字符,但是 A 实际值为 -1 , B 的值才是 255 。
枚举类型,采用 enum 类型符,可以说是一种自定义类型,为了说明 enum 的有用性,我以代码方式总结:
const int sun = 0;
const int mon = 1;
const int tue = 2;
const int wen = 3;
const int thu = 4;
const int fri = 5;
const int sat = 6;
int today = sun;
以上代码从程序可读性来说显然没有如下采用 enum 方式来的好,至于从代码执行效果来说是否有优越性我还不是很清楚,有达人知道还望指点。
typedef enum WEEKDAY
{
sun,
mon,
tue,
tue,
wen,
thu,
fri,
sat
}weekDay;
weekDay today = sun;
枚举类型实际在内存中是以 int 类型值编码的,当第一个枚举类型常量没有赋初值时,默认为 0 开始,以后依次递增 1 。
以上对四种基本类型进行了展开,而三种构造类型数组、结构体、联合体则是有四种基本类型根据需求自由组合而成。
数组类型,其实就是根据需要用户自定义以同一种类型声明一个数组长度的一组变量,数组类型本身没有类型符。在内存中以同一编码规则连续编码一块数组长度的空间。
结构类型,则是根据需求用户采用不同种类型的数据量构成的一个新的类型,它以 struct 类型符定义,在内存中以事先安排的顺序和基本类型编码规则编码。
联合体类型,由于结构类型中的每一中基本类型都是分配一块内存,但是有一种需求是一块内存可以以不同的类型来拆分,这种需求在通信中相当常见,为此引进了联合体类型。见下面列子
typedef union CODON
{
DWORD m_dwCodon;
char m_chCodon[4];
}Codon;
以上定义了常用的四个长度的码字,每一个码字都是一个字符,但是为了程序中比较运算方便我们可以用一个 DWORD (四个字节的整数类型)值来进行整数比较。
指针类型,指针类型本身是一个 32 位即 4 个字节来描述的正整数数据,表示的是变量的内存地址,所以不管指针是定义成何种类型用 sizeof 取得的始终是 4 字节长度,但是指针做增一运算时就跟具体的数据类型相关了。如 char *p ; p++ 就是加 1 ,而 int *p ; p++ 就是加 4 了。
空类型,即 void 类型,在函数返回值和形参中用的比较多,并且与指针类型常结合在一起用,该类型弱化了编码规则,但是不能用这种类型来声明和定义变量。
C++ 新增的两种类型, bool 型其实也是一个字节类型的,按照整型数据来编码,其值 true 为 1 , false 为 0 。至于 class 类型,在内存中编码规则等同与 struct 。以后将做更多的讨论。
至此,将 C 和 C++ 内的数据类型做了一个小小阐述,下一节将小结变量。
posted on 2006-11-10 23:43
frank.sunny 阅读(777)
评论(0) 编辑 收藏 引用 所属分类:
C/C++学习和实践