第二章 C语言的数据类型和运算
2.1 数据类型
数据是计算机加工处理的对象,C语言中的数据包括:常量、变量和有返回值的函数。为存储和处理的需要,将数据划分为不同的类型,编译程序为不同的类型分配不同大小的存储空间(存储单元的字节数),并对各种类型规定了该类型能进行的运算(运算符集),任何类型数据的值均被限制在一定的范围内,称为数据类型的值域(取值范围)。
2.1.1  C的数据类型
说明:    ● 构造类型是由基本类型按一定的规律构造而成的。
空类型的作用:①表示函数没有返回值;
②说明函数无参数;
③表示指针不指向任何值。
2.1.2 数值型数据的表示与存储形式
π的表示:  日常表示        C语言中的表示
                   
                 
小数点的位置是浮动的,称为浮点数形式。在计算机内部实数都以浮点形式存储,如float占4个字节,三个字节存数字部分,一个字节存指数部分。
小数点的位置是固定的,称为定点数,如:3.14159 ,10,-20, 1992显然整数都属于定点数,如:整数10,在计算机内部一般占2个字节。
定点数的小数点一般是在最高位(定点小数)或在最低位(定点整数)。对于实数型定点数如:3.14159,C语言则把它按指数形式存放3.14159e0,即C的实数一律以浮点形式存储。
2.1.3 字符型数据的表示和存储形式
字符型数如:(’a’,’A’,’#’,’3’)在内存中以相应的ASCII代码存放(占一个字节),如’a’的AS
CII代码为97,存储形式为:
在C中,ASCII代码值可以被看成整数,如’A’+32为97与’a’等价。
2.1.4  基本类型的名字和长度
下列关键字称为类型区分符:
char、 int、 short、 long、 signed 、unsigned 、float、double
类型区分符代表一个基本类型的名字,用来说明一个数据的类型。
2.1  基本类型的名字和长度
完整的类型名
简单的类型名
类型的长度(字节)
取值范围
char
char
1
有符号:-128~127
无符号:0~255
signed char
signed char
1
-128~127
Unsigned char
Unsigned char
1
0~255
int
int
2或4(与具体机器有关)
2字节:-32768~32767
4字节:约-21亿~21亿
short int
short
2
-32768~32767
long int
long
4
约-21亿~21亿
signed int
signed
2或4 (同int)
同int
Unsigned int
unsigned
2或 4(同int)
2字节:0~65535
4字节:约0~42亿
signed short int
signed short
2
-32768~32767
Unsigned short int
unsigned short
2
0~65535
singed long int
signed long
4
约-21亿~21亿
Unsigned long int
unsinged long
4
约0~42亿
float
float
4
绝对值约
13.4e-38~13.4e+38
double
double
8
绝对值约:
1.7e-308~1.7e+308
long double
long double
>=8
由具体实现定义
说明:
signed和unsigned不能同时修饰char,short和long或signed和unsigned不能同时修饰int。float不能使用任何修饰词,double可用long修饰;
int的长度与具体机器的字长相同,在16位机上为2字节,在32位机上为4字节。因此,int 的长度与shortlong 相同。
signed char用1个字节的低7位表示字符值,最高位表示符号。
unsigned char用整个字节表示字符值,无符号位。char表示有符号和无符号与具体机器系统有关,但char一定和signed charunsigned char其中之一同。在多数机器系统中,charsigned char同。
④浮点类型的范围与浮点在机器内的表示有关,标准C没有规定浮点数格式,大多数机器浮点数格式为:
对于4个字节浮点数,阶码占8位,尾数占23位,1位符号位:
对于8个字节的浮点数:
在浮点数中尾数位决定精度(有效数字位数),阶码决定取值范围
⑤对于带符号的数据类型,一般用最高位(左边第1位)表示符号,0表示正,1表示负,数值以补码形式存放(一个正数的补码是该数的二进制数),如(10)0000000000001010。一个负数的补码为取反加1,如(-10)111111*********0。表中列出的shortint long 是带符号的(隐含signed)
⑥对于无符号的数据类型,最高位不作为符号,与其它各位一起表示数值,因此,无符号数只表示正数不表示负数,与同样长度的带符号正数相比表示的最大数扩大了一倍。
⑦字符型数据也分为signedunsignedANSI标准ASCII码字符的允许取值范围为0127,用7位表示就可以了,最左位补0表示正数。有些计算机系统,除ASCII码字符外,还扩展使用一些图形符号(如“≥”),扩充使用用128255,其第一位为1。因此,对signed字符型数取值范围为-128127。对unsigned字符型,取值范围为0255
实数类型数据signedunsigned之分;
⑨以后各章均使用类型的简写形式;
⑩C语言提供了一个测试某一类型数据所占存储空间长度的运算符sizeof,格式为sizeof(类型标识符)sizeof(char)为1, sizeof(long)为4。
2.2 常量和变量
C的常量有两种形式:一种是文字常量,简称常量或常数,文字常量是由表示值的文字本身直接表示的常量,如1233.14159;另一种是符号常量,是用标识符表示的文字常量(标识符一般用大写英文字母),标识符是文字常量的名字。任何一个常量都属于一个数据类型,文字常量的类型由文字常量自身隐含说明,如123为整型,3.14159是一个浮点型,符号常量
的类型由定义时指定。
2.2.1常量的表示
C的常量有整数常量、浮点常量、字符常量、字符串常量和枚举常量。
1.整数
整数有三种形式:十进制整数、八进制整数和十六进制整数。
十进制整数
十进制整数由数字0~9组成的数字串,多位数时最左第一个数字不能为0,前面可以有表示正负的符号“+”或“-”,“+”可以省略。如738  -50  0  +39 是合法的整数。
八进制整数
八进制整数由数字0~7组成的数字串,第一个数字必须为0(前导零),它是八进制数的标志,八进制一般用于表示无符号数如:0137  027  +013  -024 是合法的八进制整数,而0128非法。
八进制可以与十进制转换:
如0137=1*8+3*8+7*8=95
若将95转换为八进制:
③十六进制整数
十六进制整数是由数字09和字母af(或A~F)组成的符号串,符号串必须以0x或0X(十六进制的前缀)开头,十六进制表示无符号整数,如0x13a 0xc32 0xff 0xb800 0xdc都是合法的十六进制整数。013a x13a 13a均为非法。
说明:
①所有整数的缺省类型是int,通过在其后面加后缀字母,可以表示长整数(long)无符号整数(unsigned)和无符号长整数(unsigned long)
长整数:在任意进制整数后面加l或L,27l 018l 0x1aL 
    无符号整数:在任意进制整数后加u或U。
27u 0400U 0x1aU 
无符号长整数:任意进制的整数后加ulUL
如:27ul  0400UL 0x1aUL.
后缀字母大小写任意,由于l与数字1容易混,常用L。
②当整数的值超出int类型所能表示的范围时,称为整数溢出。整数溢出会产生不正确的结果,为避免溢出或类型转换的需要,应根据具体情况将整数相应地表示为长整数、无符号整数或无符号长整数,如在16位机上,整数123456会产生溢出,应表示成123456L.
2、浮点数
浮点数的一般形式为:
printf函数中大小写d通用吗
[±][整数部分] [.][小数部分] [e±n]
其中[  ]表示可选项,e±n称为指数部分,1e±n 表10±n, “e”可以写成“E”。n称为阶码(1~3位十进制无符号常整数,可以有前导0但仍表示十进制),n前面的“+”可以省略。如
-123.567e+5  -123.567E5  -123.567e05 都是代表值-12356700.0
浮点数的组成规则如下:
1 一个浮点数可以无整数部分或小数部分,但不能二者均无。
2 一个浮点数可以无小数点或指数部分,但不能二者均无。
例如:3.141593  .1E+02    -.234e+5  –243.e-2  2.01234e+3  0.  .08  100.0 都是合法的浮点数。
若将2.01e+3写成2010,将0. 写成0,或将100. 写成100则它们不是浮点数而是整数。
下面一些是非法表示:
-.e+1 既无小数部分也无整数部分
1. 1e-0.5:阶码不是整数
1. 1e+I:阶码不是常量(除非I已定义为符号整型常量)
当浮点数超出它的类型所能表示的范围产生浮点溢出。如果浮点数的绝对值小于所能表示的最小值则下溢。如1.7e-309和-1.7e-309均产生下溢。下溢时绝对值太小以致机器不能表示而产生零值,称之为“机器零”。下溢时机器可能不能正常运行。当浮点数的绝对值大于所能表示的最大值时产生上溢,如1.7e309和-1.7e309均产生上溢。上溢时将产生错误的结果。
浮点数的缺省类型是double,通过在浮点数后面加后缀字母可以表示单精度(float)数、双精度数(double)和高精度 (lang double) 数。
单精度浮点数:在浮点数后面加f或F。如:3.14159F。
双精度浮点数:在浮点数后面加d或D。如:3.14159d。
高精度浮点数:在浮点数后面加l或L。如:3.14159L。
在程序中可根据存储的需要、精度的需要或类型转换的需要将浮点数表示为适当的类型。