数据类型
【知识点】
- 数据类型
- 整型
- 字符型
- 实数(浮点型)型
【内容】
一、数据类型
C语言要求在定义所有的变量时都要指定变量的类型。常量也是区分类型的。
在数学中,数值是不分类型的,数值的运算是绝对准确的,例如:78与97之和为175,1/3的值是0.33333...(循环小数)。数学是一门研究抽象的学科,数和数的运算都是抽象的。
而在计算机中,数据是存放在存储单元中的,它是具体存在的。而且存储单元是由有限的字节构成的,每一个存储单元中存放数据的范围是有限的,不可能存放“无穷大”的数,也不能存放循环小数。例如用C程序计算和输出1/3:
printf("%f",1/3.0);
得到的结果是0.333333,只能得到6位小数,而不是无穷位小数。
结论:用计算机进行的计算不是抽象的理论值的计算,而是用工程的方法实现的计算,在许多情况下只能得到近似的结果。
所谓类型,就是对数据分配存储单元的安排,包括存储单元的长度(占多少字节)以及数据的存储形式。不同的类型分配不同的长度和存储形式。
数据类型的分类:(带*表示C99添加)
- 基本类型
- 整型类型
- 短整型(short [int])
- 基本整型(int)
- 长整型(long [int])
- *双长整类型(long long [int])
- *布尔型(bool)
- 实数(浮点)类型
- 单精度浮点型(float) 占4个字节,有效数为6位
- 双精度浮点型(double) 占8个字节 有效数为15位
- *长双精度浮点型(long double)
- 字符类型(char) 占1个字节
- 整型类型
- 枚举类型(enum)
- 空类型(void)
- 派生类型(5)
- 指针类型(*)
- 数组类型([])
- 结构体类型(struct)
- 共用体类型(union)
- 函数类型
在C语言之中没有字符串变量,字符串使用字符数组表示。C语言中对数据类型没有设定默认值。
二、整型数据
整型数据在存储单元中的存储方式是:以二进制补码形式存储。一个正数的补码,是该数的二进制形式。一个负数的补码,是该负数的绝对值的原码取反加1的形式。
例如:-5的补码
在存放整数的存储单元中,最左面一位是用来表示符号的。如果该位为0,表示数值为正。如果该位为1,表示数值为负。
如果给整型变量分配2个字节,则存储单元中能存放的最大值为01111111 11111111,最小值为10000000 00000000。超过此范围,就会出现数值的“溢出”。
- 基本整型(int)
- 短整型(short [int])
- 长整型(long [int])
- 双长整型(long long [int])
注意:C标准没有具体规定各种数据类型所占用存储单元的长度。这是由各编译系统自行决定的。C标准只要求long型数据长度不短于int型,short型不长于int型。即:
sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
sizeof是测量类型或变量长度的运算符。
整型变量的符号属性
- 基本整型
- 有符号基本整型:[signed] int
- 无符号基本整型: unsigned int
- 短整型
- 有符号短整型: [signed] short [int]
- 无符号短整型: unsigned short [int]
- 长整型
- 有符号长整型: [signed] long [int]
- 无符号长整型: unsigned long [int]
- 双长整型
- 有符号双长整型: [signed] long long [int]
- 无符号双长整型: unsigned long long [int]
注:在整型数据中,如果既未指定signed也未指定unsigned,默认为“有符号类型”。
有符号整型数据存储单元中最高位代表符号(0为正,1为负)位。没有符号整型数据存储单元中,全部的二进位都用作存放数值本身。
注:
- 只有整型、字符型数据可以加signed或unsigned修饰符,实型数据不能加。
- 对无符号整型数据用“%u”格式输出。%u表示用无符号十进制数的格式输出。
【思考题】:
得到的结果为len = 65535
原因是:系统对-1先转换成补码形式,如下图
由于len变量是无符号类型,所以存储单元中的第一位作为数值位存放数值。所以按“%u”格式输出结果是:len = 65535
结论:整型数据不管有无符号,在计算机内存储方式都是以二进制补码形式存储。
三、字符型数据
目前大多数系统采用ASCII字符集,各种字符集(包括ASCII字符集)的基本集都包括了127个字符。所有127个字符都可以用7个二进位表示(ASCII码值为127时,二进制形式为1111111,7位全1)。所以在C中,指定1个字节(8位)存储一个字符(所有系统都不例外)。此时,字节中的第1位置为0。
字符变量实际上是一个字节的整型变量,由于它常存放字符,所以称为字符变量。可以把0-127之间的整数赋给一个字符变量。
在输出字符变量时,可以选择以十进制整数形式输出,或以字符形式输出。如:
字符变量的符号属性
说明:在使用有符号字符型变量时,允许存储的值为-128—127,但字符的代码不可能为负值,所以在存储字符时实际上只用到0—127这一部分,其第1位都是0。
如果将一个负整数赋给有符号字符型变量是合法的,此时它不代表一个字符,而作为一字节整型变量存储负整数。如:
signed char ch = -6;
如果在定义变量时既不加signed,又不加unsigned,C标准并未规定是按signed char处理还是按unsigned char处理,由各编译系统自己决定。
四、浮点型数据
在C语言中,实数是以规范化的二进制指数形式存放在存储单元中的。
规范化二进制指数形式:小数点前为0,小数点后第1位不为0的表示形式。(也就是尾数大于等于0.1小于1)
浮点数类型:单精度浮点型(float)、双精度浮点型(double)、长双精度浮点型(long double)
float型(单精度浮点型)
编译系统为每一个float型变量分配4个字节,数值以规范化的二进制数指数形式存放在存储单元中。在存储时,系统将实型数据分成小数部分和指数部分两个部分,分别存放。
在4个字节(32位)中,究竟用多少位来表示小数部分,多少位来表示指数部分,C标准并无具体规定,由各C语言编译系统自定。
由于用二进制形式表示一个实数以及存储单元的长度是有限的,因此不可能得到完全精确的值,只能存储成有限的精确度。小数部分占的位(bit)数愈多,数的有效数字愈多,精度也就愈高。指数部分占的位数愈多,则能表示的数值范围愈大。
float型数据能得到6位有效数字,精度误差在1e-6。
double型(双精度浮点型)
用8个字节存储一个double型数据,可以得到15位有效数字,精度误差在1e-15。在C语言中进行浮点数的算术运算时,系统将float型数据都自动转换为double型,然后进行运算。
long double型(长双精度浮点型)
不同的编译系统对long double型的处理方法不同。
五、怎样确定常量的类型
在C语言中,不仅变量有类型,常量也有类型。
在程序中出现的常量是要存放在计算机中的存储单元中的。这就必须确定分配给它多少字节,按什么方式存储。
怎样确定常量的类型?
从常量的表示形式即可判定其类型。
整型常量:不带小数点的数值是整型常量,但应注意其有效范围。在一个整数的末尾加大写字母L或小写字母l,表示它是长整型(long int)。
整型常量以二进制补码形式存储在计算机的存储单元中。
浮点型常量:小数形式或指数形式的实数。在C语言编译系统中将浮点型常量按双精度浮点型处理。(C程序中的浮点型常量都是双精度浮点型常量)
浮点型常量以规范化的二进制指数形式存储在计算机存储单元中。
可以在常量的末尾加专用字符,强制指定常量的类型。
- 在常量后面加F或f表示是float型;
- 在实型常量后面加L或l表示long double型;
有道云笔记详情:数据在内存中如何存储