数据类型
综述
C语言具有丰富的数据类型.C语言中的数据类型分为四大类,即基本数据类型,构造类型,指针类型和空类型.
本章内容如下:
- C语言中的数据类型
- 整形数据
- 实数型/浮点型数据
- 字符型数据
- 数据类型的转换
C语言中的数据类型
数据可以根据被说明量的性质,表现形式,占据的存储空间的多少,构造特点来划分.
数据的类型不同,它们的取值范围,运算属性和储存方式都会不同,C语言程序中所用到的数据都必须指明一定的数据类型才能使用
具体划分见下表:
-
数据类型
-
基本类型
- 整型
- 带符号整型:带符号整型,带符号短整型,带符号长整形
- 无符号整型:无符号整型,无符号短整型,无符号长整形
- 实数型
- 单精度型
- 双精度型
- 字符型
- 字符串
- 整型
-
构造类型
- 数组型
- 结构型
- 共用型
-
指针类型
-
空类型
基础数据类型
基本数据类型是语言系统定义的数据类型,只能有单一的值,在程序定义变量时可直接应用.
C语言的基本数据类型:整型,实数型,字符型
构造数据类型
构造类型数据是由基本数据按照一定的规则组合而成,因此也称为导出型数据.
C语言的构造数据类型主要是为了节约内存,将相同的数据放在一起,只需要声明一次,然后在结构体中存放相同的数据.
指针型数据
指针是一类特殊的数据类型,是C语言的核心,也是C语言的重点所在.
指针型数据的值用来表示某个量在内存储器中的地址.
空类型
空类型是从语法的完整性角度出发,给出的一种护具类型,表示不需要具体的数据值,因此也就没有数据类型.
整型数据
整型数据分为:一般整型,短整型和长整形,每一个类型又可分为有符号和无符号
其区别主要在于所占字节和取值范围.
声明和说明如下:
声明 | 说明 | 所占字节 | 取值范围 |
---|---|---|---|
short int | 短整型 | 2 | -32768~32767 |
signed short int | 带符号短整型 | 2 | -32768~32767 |
unsigned short int | 无符号短整型 | 2 | 0~65535 |
int | 整型 | 4 | -2147483648~2147483647 |
signed int | 带符号整型 | 4 | -2147483648~2147483647 |
unsigned int | 无符号整形 | 4 | 0~4294967295 |
long int | 长整形 | 4 | -2147483648~2147483647 |
signed long int | 带符号长整形 | 4 | -2147483648~2147483647 |
unsigned long int | 无符号长整形 | 4 | 0~4294967295 |
整形常量
整形常量的数据类型是整数,包括正整数,负整数和零.C语言中,整数有以下几种表达方式:
- 十进制整型常量
- 八进制整形常量:以数字0开头
- 十六进制整数型常量:以0x或者0X开头
整形变量
整形变量的定义
前面已经讲过,略
整型变量的溢出
当数字高于表示范围时,会去除高位.
实数型/浮点型数据
实数型数据表示的是带小数的数,又称为浮点型数据
浮点型数据可以分为三种:单精度浮点数,双精度浮点数,长双精度浮点数
声明 | 说明 | 所占字节 | 取值范围 | 有效数字 |
---|---|---|---|---|
float | 单精度浮点数 | 4 | -3.4×1038~3.4×1038 | 6~7 |
double | 双精度浮点数 | 8 | -1.7×10308~1.7×10308 | 15~16 |
long double | 长双精度 | 16 | -1.2×104932~1.2×104932 | 18~19 |
有效位数:
#include<stdio.h>
int main(){
float x;
x=1.23456789;
printf("%12.10f",x);
return 0;
}
>>>1.2345673849
注意输出的前7位为有效数字,后四位为随机数.
实数型常量
实数型常量的表示方法有以下两种:
小数表示法
±整数.小数
整数和小数部分可以选择一个省略
指数表示法
±尾数部分E(e)±指数部分
实际上等价于: ±尾数部分×10±指数部分
需要说明的几点如下:
- 实数型常量的类型都是双精度浮点型
- 是输在计算机中都是近似表达,运算中也会产生误差
- 小数部分和直属部分具体有多少位,没有统一标准,不同编译系统会有误差.
实数型变量
略
字符型数据
在说明字符型变量之前需要说说计算机是如何显示字符(英文)的.
根据二进制,我们能够实现实数的显示.因此我们使一部分数字与每一个字符一一对应,然后在输出的时候声明输出为字符,这样就能够在计算上显示了.
例如:
我们令065与A一一对应
则我们在输出的时候声明按照字符输出,这个时候就不会输出065了,而是输出A.
因此,每一个字符就和一个整数一一对应
这样的一一对应关系整体,称为字符集
字符型变量数据由字母,符号和不用于算术操作的数字组成,又称为非数值型数据
字符型数据可以分为字符型(char),带符号字符型(signed char)和无符号字符型(unsigned char)
具体声明和说明见下;
声明 | 说明 | 所占字节 | 取值范围 |
---|---|---|---|
char | 字符型 | 1 | -128~127 |
signed char | 带符号字符型 | 1 | -128~127 |
unsigned char | 无符号字符型 | 1 | 0~255 |
需要注意的是,根据上面的描述:在C语言中,字符具有数值的性质,因此字符参与运算实际上就是字符的ASCII码值进行运算
字符型常量
字符型常量就是有一对单引号括起来的一个字符.
'a','B','-','+'
字符常量的值就是他的ASCII码值.
字符型变量
字符型变量就是一个标识符表示字符型数据,并且值可以发生变化.但是注意,一个字符变量只能存放一个字符.
想要实现多个字符的存储需要用字符串.
需要注意的有以下几点:
- 在ASCII表值内字符型数值可以给整形变量赋值,整型数值也可以赋值给字符型变量
- 字符型变量可以用字符形式输出(%c),也可以用整数形式输出(%d)
数据类型的转换
先看两个例子
c=5/2; d=5/2.0; >>>c=2,d=2.5
可以发现,虽然计算的式子相同,但是得到的结果却不同
这是因为上式涉及到了数据类型的转换
C语言中,不同类型的数据之间可以进行混合运算.
但是在混合运算的过程中,系统实际上会将不同类型的数据转换相同类型的数据,在进行计算.
同时,有的时候我们在编写程序的时候也需要将不同类型的数据转换成相同类型的数据.
因此我们有必要了解不同数据类型之间的转换.
数据类型的转换,又可以分为:自动类型转换和强制类型转换
自动类型转换
自动类型转换是由系统自动完成的,又称为隐式转换.
自动类型转换主要是在数据运算的过程中由编译规则所决定的将参与运算的数据统一转换成何种格式.
自动类型转换的规则如下:
举个例子
int i;float f;double d;long e;
10+‘a’+i*f-d/c
10+'a’→int i*f→double d/c→double
int+double+double→double
强制类型转换
强制类型转换是运用转换运算符来强制转换.
(类型名) 表达式
例如:
(float) x;
(int) (x+y);
(int) x+y;
一些注意事项如下:
- double→float:截取前七位有效数字
- float,double→int:保修整数位
- long int→short int:保留低位
- signed↔unsigned:符号位和数据位互相转换
d/c→double
int+double+double→double
强制类型转换
强制类型转换是运用转换运算符来强制转换.
(类型名) 表达式
例如:
(float) x;
(int) (x+y);
(int) x+y;
一些注意事项如下:
- double→float:截取前七位有效数字
- float,double→int:保修整数位
- long int→short int:保留低位
- signed↔unsigned:符号位和数据位互相转换
- others→char:在允许范围内保留整数