测试数据长度
main()
{
char ch;
printf("char:%d\n",sizeof(char));
printf("short int:%d,int:%d,lint:%d\n",sizeof(short int),sizeof(int),sizeof (long int));
printf("float:%d,lfloat:%d\n",sizeof(float),sizeof(long float));
printf("double:%d,ldouble:%d\n",sizeof(double),sizeof(long double));
}
程序运行结果为
char:1
short int:2,int:4,lint:4
float:4,lfloat:8
double:8,ldouble:8
2.1.1 五种基本数据类型
C语言提供的五种基本数据类型以及对应的关键字如下:
数据类型, | 关键字 |
字符型, 整型, 浮点(单精度)型, 双精度型, 无值类型, | char int float double void |
其中,字符型(char)通常描述一个字符;整型(int)描述我们日常使用的整数,整数在计算机中是准确表示的;浮点型(float)和双精度型(double)描述我们日常使用的实数,实数在计算机中一般是近似表示的,浮点型的近似程度比较低,而双精度型的近似程度则比较高,因此,浮点型有时也叫单精度型;无值类型(void)没有具体的值,通常描述一个无形式参数的C函数、无返回值的C函数或无定向指针等。
2.1.2 基本数据类型存储方式和取值范围
不同类型的数据在计算机中的存储方式是不同的,即它们的存储结构和所占的存储空间字节数并不一样。这不是C语言本身的规定,而是与宿主计算机的硬件特性有关。
1. char型 char型数据占1字节存储空间,有的机器(如IBM PC系列)按有符号形式存储,采用二进制补码,这样,其表示范围为-128~127。有的机器则以无符号二进制形式存储,所能表示的字符十进制ASCII或EBCDIC代码值为0~255。有符号和无符号数之间的区别在于对数的最高位的处理:有符号数将最高位视为符号位,0表示正号,1表示负号;无符号数则将最高位也视为数值位。
2.int型 int型数据占2字节存储空间,按有符号形式存储,有的机器采用定点二进制原码形式,所能表示的数值范围为-32767~32767;IBM PC系列计算机则以定点二进制补码形式存储,所能表示的数值范围为-32768~32767。
3. float型 float型数据占4字节存储空间,以浮点形式存储,即将存储空间分成两部分,一部分表示指数,用定点纯整数形式,另一部分表示尾数,用定点纯小数形式。在IBM PC系列机上,阶码(二进制指数的幂次)占8位(增码表示),尾数占24位(归一化补码表示),因此它所能表示的十进制数值范围为-3.4×1038 ~3.4×1038 ,6位有效数字精度,分辨率(可识别的最小正数)约为3.9×10-38 ,即对小于3.9×10-38 的正数不再区分,作为0来处理(称为下溢)。
4. double型 double型数据占8字节存储空间,存储方式与float基本相同,在IBM PC机上,阶码占11位,尾数占53位,因此它所能表示的数据范围约为-1.7×10308 ~1.7×10308 ,16位有效数字精度,分辨率约为10-308 。
表2.1列出几种不同类型计算机上各种数据类型所占的二进制位(bit)数。C基本数据类型的长度及其取值范围见表2.2(IBM PC系列计算机)。
表2.1 不同计算机中数据类型的长度(bit数)
计算机型 | IBM PC | DEC PDP-11 | DEC VAX | Honey well 6000 | IBM 370 | Interpata 8/32 |
数据类型 | ASCII | ASCII | ASCII | ASCII | EBCDIC | ASCII |
char | 8 | 8 | 8 | 9 | 8 | 8 |
int | 16 | 16 | 32 | 36 | 32 | 32 |
short int | 16 | 16 | 16 | 36 | 16 | 16 |
long int | 32 | 32 | 32 | 36 | 32 | 32 |
float | 32 | 32 | 32 | 36 | 32 | 32 |
double | 64 | 64 | 64 | 72 | 64 | 64 |
表2.2 C基本数据类型的长度和取值范围(IBMPC系列)
类型 | 长度(bit) | 取值范围 |
char | 8 | -128~127 |
[signed] char | 8 | -128~127 |
unsigned char | 8 | 0~255 |
int | 16 | -32768~32767 |
[signed] int | 16 | -32768~32767 |
unsigned [int] | 16 | 0~65535 |
short int | 16 | -32768~32767 |
unsigned short [int] | 16 | 0-65535 |
long int | 32 | -2147483648~2147483647 |
[signed] long [int] | 32 | -2147483648~2147483647 |
unsigned long [int] | 32 | 0~4294967295 |
float | 32 | -3.4×1038 ~3.4×1038 |
double | 64 | -1.7×10308 ~1.7×10308 |
long double | 80 | -1.7×10308 ~1.7×10308 |
注:方括号内的关键字可省略。
2.1.3 基本数据类型的修饰
C语言规定,在基本数据类型之前还可以加上类型修饰符
signed,unsigned,short,long
和存取修饰符
const,volatile。
1. 类型修饰符
类型修饰符用于更改基本类型的含义,以适应更为精确情况的需要。
signed和unsigned规定了对数值符号的处理方法,只限于char型和int型。无符号数总为正值或零,且服从模为2的n次幂定律。这里的n表示该类型所具有的二进制位数。若char型数据占8位,则unsigned char型数据的取值范围为0~255,而signed char型数据的取值范围则为-128~127(在使用2的补码的计算机上)。int型数据的signed和unsigned修饰与char型类似。例如,signed int和int的存储方式及取值范围完全相同,而unsigned int采用无符号数的方式存储,其取值范围则为0~65535。
short和long可以提供不同的数据长度以满足实际使用的需要。例如,int型数据的长度通常反映了宿主计算机的自然字长,short int常为16位,long int 常为32位,而int则为16位或32位(IBM PC系列为16位),long int的取值范围变为-2147483648~2147483647。不同C编译系统可以选择合适的长度以适应自身的硬件,但要满足如下的限制:short int和int至少为16位,long int 至少为32位,且short int不长于int,int不长于long int 。有的C编译系统还允许对double进行long限定,一般地,float不长于double,double不长于long double。
对类型修饰符,说明以下几点:
(1) char型数据可用signed和unsigned加以修饰,即可能出现char、signed char或unsigned char;
(2) int型数据可用signed、unsigned、short和long加以修饰,即可出现int、signed int 、unsigned int、long int、signed long int、unsigned long int等,当使用类型修饰符后,关键字int可省略不写,例如signed long等价于signed long int;
(3) 有的编译系统允许对double施加long修饰,使其成为超精度型数据。在Turbo C中,long double型数据占10字节存储空间,阶码11位,尾数69位,除了具有更多的有效数字(20位)外,数据表示范围及分辨率均与double型相同。早期的C语言版本允许使用long float等价于double ,现已不用;
(4) C语言的ANSI C标准指出:各种变量的取值范围应该在标题文件(limits.h)和(float.h)中作出定义,因此,可以从上述标题文件中打印出相应的值。
2. 存取修饰符
存取修饰符const和volatile可放在任何类型之前,用于限制变量存取或修改的方法。
使用const修饰的变量,相当于符号常数,可存放在只读内存中,除了初始化外,不能由程序修改;使用volatile修饰的变量,则可以被修改,既可以在程序中修改它,也可以在程序外,如中断过程或I/O端口修改它。把一个对象说明为volatile,就告知编译系统在计算有该对象的表达式时,不必关心对象的值,因为其值(理论上)可在任何时刻改变。该修饰符防止编译系统把该变量当作寄存器变量处理。任何类型的变量都可用const或volatile修饰,const修饰就宣告它的值不会被修改,volatile修饰后就宣告它有和最优化有关的特殊性质。初学者对const和volatile可不必深究。