数据类型详解

整型

在C语言中,char 型占一个字节的存储空间,一个字节通常是 8 个 bit. 如果这 8 bit 按无符号整数来解释,取值范围是0~255,如果按有符号整数来解释,采用2’s Complement 表示法,取值范围是-128~127。C语言规定了 signed 和unsigned 两个关键字,unsigned char 型表示无符号数,signed char 型表示有符号数。

那么以前我们常用的不带 signed 或 unsigned 关键字的 char 型是无符号数还是有符号数呢?C 标准规定这是 Implementation Defined,编译器可以定义 char 型是无符号的,也可以定义 char 型是有符号的,在该编译器所对应的体系结构上哪种实现效率高就可以采用哪种实现,x86 平台的 gcc 定义 char 型是有符号的。如果要考虑移植性的话,最好写明有无符号。

注意,ASCII 码的取值范围是 0~127,所以不管 char 型是有符号的还是无符号的,存一个 ASCII 码都没有问题,一般来说,如果用 char 型存 ASCII 码字符,就不必明确写是 signed 还是 unsigned,如果用 char 型表示8位的整数,为了可移植性就必须写明是 signed 还是 unsigned。

除了 char 型之外,整型还包括 short int(或者简写为 short)、int、long int(或者简写为 long)、long long int(或者简写为 long long)等几种,这些类型都可以加上 signed 或 unsigned 关键字表示有符号或无符号数。

除了 char 型在 C 标准中明确规定占一个字节之外,其它整型占几个字节都是 Implementation Defined。通常的编译器实现遵守ILP32或LP64规范,如下表所示。

类型 LP32(位数) LP64(位数)
char 8 8
short 16 16
int 32 32
long 32 64
long long 64 64
指针 32 64

浮点型

C 标准规定的浮点型有 float、double、long double,和整型一样,既没有规定每种类型占多少字节,也没有规定采用哪种表示形式。浮点数的实现在各种平台上差异很大,有的处理器有浮点运算单元(FPU,Floating Point Unit),称为硬浮点(Hard-float)实现;有的处理器没有浮点运算单元,只能做整数运算,需要用整数运算来模拟浮点运算,称为软浮点(Soft-float)实现。大部分平台的浮点数实现遵循 IEEE 754,float 型通常是 32 位,double 型通常是 64 位。