C语言教程,数据类型
学习目的:在编制算法时,必须
注意数据结构。通过讲解数据类
型、运算符的概念,使学生熟悉
并能正确应用。
数据类型内容介绍
1 C语言的数据类型
2 常量和变量
3 整型数据
4 实型数据
5 字符型数据
数据与数据类型的概念
计算机中的数据的概念
用来描述现实世界中各种对象和概念的属性、性质的数字化形式
现实世界中的数据种类
数字、文字、图形、声音、学生的档案记录、货物的运输情况等等
表示不同种类数据的计算机内结构形式成为 计算机的数据类型
C语言中的数据类型的概念
就是 C语言在计算机中表示现实数据数据形式,不同种类的数据,在计算机中的
表示形式(即存储结构)也不相同。例如
字符型数据’ A?
(即 16进制的 41)
整型数据 327
(即 16进制的 147)
C程序中两种基本数据形式:常量和变量
0 1 0 0 0 0 0 1
字节 1
7 6 5 4 3 2 1 0
0 0 0 1 0 1 0 0
字节 2
15 14 13 12 11 10 9 8
0 0 0 0 0 0 0 0
字节 1
7 6 5 4 3 2 1 0
数据类型及其存储结构








int 16bit
short 16bit
long 32bit
unsigned int 16bit
unsigned short 16bit
unsigned long 32bit


float 32bit 6~7 位有效数字 范围 10-37~1038
double 64bit 15~16位有效数字 范围 10-307~10308


char 8bit 存放字符的 ASCII码值
-32768~32767 即 -215~( 215-1)
-32768~32767 即 -215~( 215-1)
0~65535 即 0~( 216-1)
0~65535 即 0~( 216-1)
说明:上面的 short也可以写成 short int,long也可以写成 long int;前面没有
unsigned的,表示为有符号型整型,前面可以加 signed,也可以省略。
C语言中的数据类型及其存储结构
其他的数据类型(以后详细的介绍)
基本数据类型
? 枚举
构造数据类型
? 数组
? 结构体
? 共用体
指针类型
空类型
?测试数据类型所占字节数的 sizeof运算符
printf(“%d\n”,sizeof(int)); /*结果为 2*/
printf("%d\n",sizeof(long int)); /*结果为 4*/
printf("%d\n",sizeof(float)); /*结果为 4*/
printf("%d\n",sizeof(double)); /*结果为 8*/
printf("%d\n",sizeof(char)); /*结果为 1*/
C语言中的数据类型及其存储结构
数值的原码与补码表示
原码表示
最高位为符号位,正为 0,负为 1,其他位为实际值,如 10,原码表示为
-10,原码表示为
补码表示
符号位与原码相同,对于其余部分,正数也与原码相同,负数则为原码的
各位取反,末位加 1
例如,-10,补码表示如下,
,
+1
注意:将补码转换为原码的方法,与原码到补码的转换相同
-10的原码
C语言中的数据类型及其存储结构
整型数据的存储结构
不同类型的整型数据在内存中所占的 bit数(字节数)
见上面
整数在计算机内部以补码表示
,
C语言中的数据类型及其存储结构
C语言中的数据类型及其存储结构
说明:当一个整型数据被当作其它类型的数据看待时,其所具有的值不尽相同
C语言中的数据类型及其存储结构
整型数据的益处
? 举例
main()
{
int a,b;
a=32767;
b=a+1;
printf(“%d,%d\n”,a,b);
/*输出结果,32767,-32768*/
}
数据类型及其存储结构
实型数据在计算机中的存储形式
数据类型及其存储结构
实型数据的舍入误差
由于实型变量是由有限的存储单元组成的,因此能提供的有效数字
总是有限的。如下例。
main()
{float a,b;
a=123456.789e5; /*即 a=12345678900*/
b=a+20 /*b应该等于 12345678910*/
printf("%f\n",a);
printf("%f\n",b);
/*结果却是如下,
12345678848.000000
12345678848.000000
*/
}
原因,a只有 7位有效数字
数据类型及其存储结构
注意,1.0/3*3的结果并不等于 1。
【 例 3.7】
main()
{
float a;
double b;
a=33333.33333;
b=33333.33333333333333;
printf("%f\n%f\n",a,b);
/*结果,
33333.332031
33333.333333
*/
}
从本例可以看出,由于 a 是单精度浮点型,有效位数只有七位。而整数已占五位,故
小数二位后之后均为无效数字。 b 是双精度型,有效位为十六位。但 Turbo C 规定
小数后最多保留六位,其余部分四舍五入。
数据类型及其存储结构
字符型数据在内存中的存储形式
C中使用 1个字节存储字符型数据
实际存储的是字符的 ASCII码值,例如
字符’ A?的 ASCII码值是 65,即 16进制的 41
字符数据可以当作一个整数
字符串在内存中的存储形式
在存储字符串常量时,由系统在字符串的末尾自动加一个‘ \0?作为字符串的结
束标志。
注意,在源程序中书写字符串常量时,不必加结束字符‘ \0?,否则画蛇添足。
如果有一个字符串为,CHINA”,则它在内存中的实际存储如下所示,
最后一个字符 '\0'是系统自动加上的,它占用6字节而非5字节内存空间。
常量
概念:程序运行过程中值不变的数据
两种形式的常量:字面常量和符号常量
符号常量的定义 #define PI 3.1415926
符号常量的值不允许改变,如 PI++,错误
C语言中的常量类型
整型、实型、字符型、字符串型
整型常量( 16位)
十进制 (12)、十六进制( 0x12或 0X12)、八进制( 012)
合法的整型常量 237,0101, 0X2A
不合法的整型常量 23D, 03A2, 5A
注意,- 八、十六进制常量通常是正数,不能是负数,即无,–,;
- 后缀 l和 L表示长整型
- 后缀 u和 U表示无符号的整数
- 前缀和后缀可以混合使用,如 358000L, 0200000L, 0X10000L,
0XA5Lu
常量
实型常量
十进制数形式:由数码 0~ 9和小数点组成。
例如,
0.0,25.0,5.789,0.13,5.0,300.,-267.8230
等均为合法的实数。注意,必须有小数点。
指数形式:由十进制数,加阶码标志,e”或,E”以
及阶码(只能为整数,可以带符号)组成。
其一般形式为,
a E n( a为十进制数,n为十进制整数)
其值为 a*10n。
常量
如,
2.1E5 (等于 2.1*105)
3.7E-2 (等于 3.7*10-2)
0.5E7 (等于 0.5*107)
-2.8E-2 (等于 -2.8*10-2)
以下不是合法的实数,
345 (无小数点 )
E7 (阶码标志 E之前无数字 )
-5 (无阶码标志 )
53.-E3 (负号位置不对 )
2.7E (无阶码 )
标准C允许浮点数使用后缀。后缀为,f”或,F”即表示该数
为浮点数。如 356f和 356.是等价的。
常量
字符常量
一般字符常量
字符常量是用单引号括起来的一个字符。
例如:‘ a?、‘ b?、‘ =?、‘ +?、‘??、’ 5?
特殊字符常量(转义字符常量):以反斜杠 \开头
,
练习,
?分析下面字符串的字符个数,
” \5689\nxy\1A\FG\n,
?分析下面语句输出的结果
printf(,ab c\tde\rf\n”);
printf(“hijk\tL\bM\n”);
常量
在C语言中,字符常量有以下特点,
? 字符常量只能用单引号括起来,不能用双引号或其它括号。
? 字符常量只能是单个字符,不能是字符串。
? 字符可以是字符集中任意字符。注意,数字字符与数字是有区
别的,如‘ 5?和 5 是不同的。‘ 5?是字符常量,而 5是整型数据
字符串常量
字符串常量是用一对双引号括起来的若干字符序列。
字符串中字符的个数称为字符串长度。长度为 0的字符串(即一个字符都没有的
字符串)称为空串,表示为,” (一对紧连的双引号)。
例如,,How do you do.”、,Good morning.”等,都是字符串常量,其长度分别
为 14和 13(空格也是一个字符)。
如果反斜杠和双引号作为字符串中的有效字符,则必须使用转义字符。
例如,1) C:\msdos\v6.22 → "C,\\msdos\\v6.22"
2) I say:"Goodbye!" → "I say,\"Goodbye!\",
变量
变量的概念
变量是系统为程序分配的一块内存单元,其值可
以改变。一个变量与三个概念有关:存储单元、存
储单元地址、变量名、变量值,设有 int a=3;
变量必须先初始化然后才能引用,如
int x=0,y ;
x=x+1; /*正确 */
y=y+1; /*错误 */
存储单元地址
存储单元 变量的值
a为变量名
变量
C语言中变量的类型(同前面的数据类型)
变量赋初值
变量定义中赋初值的一般形式为,
类型说明符 变量 1= 值 1,变量 2= 值 2,…… ;
例如,
int a=3;
int b,c=5;
float x=3.2,y=3f,z=0.75;
char ch1='K',ch2='P';
应注意,在定义中不允许连续赋值,如 a=b=c=5是不
合法的,如 int a=b=c=5 错误,语句 a=b=c=5 ;正确。
类型转换
自动类型转换(也叫隐式类型转换)
强制类型转换(也叫显式类型转换)
强制类型转换是通过 类型转换运算 来实现的。其一般形式为,
(类型说明符 ) (表达式 )
其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。
例如,
(float) a 把 a转换为实型
(int)(x+y) 把 x+y的结果转换为整型
在使用强制转换时应注意以下问题,
? 类型说明符和表达式都必须加括号 (单个变量可以不加括号 ),如
把 (int)(x+y)写成 (int)x+y则成了把 x转换成 int型之后再与 y相加了。
? 无论是强制转换或是自动转换,都只是为了本次运算的需要而对
变量的数据长度进行的临时性转换,而不改变数据说明时对该变
量定义的类型。
变量
变量
表达式数据类型自动提升
? 所有的 char和 short将被提升到 int型
? 如果一个操作数是 unsigned型,计算结果也
就是 unsigned
? 如果一个操作数是 long型,计算结果就是
long型
? 如果一个操作数是 float或 double,计算结果
就是 double型
4种类型转换情况
表达式运算时自动类型转换后运算、强制类
型转换、赋值赋值时进行类型转换,输出数
据时进行类型转换
double float
long
unsigned
int char
short
变量
常见类型转换的规则
实型 ->整型转换
舍弃实数的小数部分,如 int i=3.56结果为 3
字符 ->整型 (int)
? unsigned char -> int
? signed char -> int
例如 unsigned char c=?\376?
int i=c;
printf(“%d”,i)
结果,254
又例如 signed char c=?\376?
结果,-2
int,short,long -> char
int i=289;char c=i;
unsigned char
int
?\376?
254
符号位
符号位
char
int
?\376?
-2
int
char
289
?\41? 即 ’ A?
32781U
-32755
unsigned int
int
变量
unsigned ->signed
? unsigned int -> long
? unsigned int -> int
signed -> unsigned
? int -> unsigned int
注意,只能是相同长度之间传送
转换的规律
按存储单元中的存储形式直接传送
unsigned int
long
13U
13L
32781U
-32755
unsigned int
int
数据类型 结束