所谓类型,就是对数据分配存储单元的安排,包括存储单元的长度(占多少字节)以及数据的存储形式。不同的类型分配不同的长度和存储形式。
数据类型分类
- 基础类型
(1)整形类型:基础整形(int)、短整型(short int)、长整型(long int)、双长整型(long long int)、字符型(char)、布尔型(bool)
(2)浮点类型:单精度浮点型(float)、双精度浮点型(double)、复数浮点型(float_complex、double_complex、long_complex)
-
枚举类型(enum)
-
空类型(void)
-
派生类型
(1)指针类型(*)
(2)数组类型([])
(3)结构体类型(struct)
(4)共用体类型(union)
(5)函数类型(function)
整型数据
整形数据的分类
| 类型 | win32 | win64 | linux32 | linux64 | 取值范围 |
|---|---|---|---|---|---|
| short | 2 | 2 | 2 | 2 | -2^7~ 2^7-1 |
| unsigned short | 2 | 2 | 2 | 2 | 0 ~ 2^16 -1 |
| int | 4 | 4 | 4 | 4 | -2^15~2^15-1 |
| unsigned int | 4 | 4 | 4 | 4 | 0 ~ 2^32 -1 |
| long | 4 | 4 | 4 | 8 | -2^31~2^31-1 |
| unsigned long | 4 | 4 | 4 | 4 | 0 ~ 2^32 -1 |
| long long | 8 | 8 | 8 | 8 | -2^31~2^31-1 |
| unsigned long long | 8 | 8 | 8 | 8 | 0 ~ 2^64 -1 |
这其中要特别注意long类型,win系统的数据长度都为4字节,而Linux64中数据长度为8字节,二者不统一,所以编写跨平台的软件时尽量不要使用long类型,或者需要对long类型做特殊处理。
关键字signed和unsigned
-
signed 是一般是被默认省略(不用特意表示出来),表示数据是有符号的,即表示可以储存负整数和正整数。
-
unsigned:需要特意表示出来 ,表示数据是没有符号的,即不能表示正负,所以一般认为其表示的是正整数
区别:signed需要用一个字节来储存符号,进而同类型下的signed能存储的数值的绝对值的大小小于unsigned。
注意: 只有整形(包括字符型)数据可以加signed或unsigned,实型数据不能加。
字符型数据
| 类型 | Win | Linux | 取值范围 |
|---|---|---|---|
| char | 1 | 1 | -128~127 |
| unsigned char | 1 | 1 | 0~255 |
char类型用于存储字符,但从技术层面看,char是整数类型,因为char类型实际存储的是整数而不是字符。计算机使用数字编码来处理字符,即用特定的字符(一般为ASCII编码),其无符号为unsigned char。
注意:
(1)在使用有符号字符型变量时,允许存储的值为-128 ~ 127,但字符的代码不可能为负值,所以在存储字符时实际上只用到0 ~ 127这一部分。
(2)127个字符对于某些情况不够用,所以会使用unsigned char,这样就可以存放255个字符代码,但并不适用于所有系统,可以使用以下语句检查ASCII代码从128 ~ 255部分的扩展字符: unsigned char c = 128; printf("%d:%c\n",c,c);
浮点型数据
常用科学计数法是将所有的数字转换成
的形式,其中a的范围是1到9共9个整数,b是小数点后的所有数字,c是10的指数。而计算机中存储的都是二进制数据,所以浮点型数据存储的数字都要先转化成
由于二进制中最大的数字就是1,所以表示法可以写成
的形式,浮点型数据要想存储小数就只需要存储(±),b和c就可以了。
float存储方式
float的存储是将4字节32位划分为了3部分来分别存储正负号,小数部分和指数部分的:
Sign(1位):用来表示浮点数是正数还是负数,0表示正数,1表示负数。
Exponent(8位):指数部分。即上文提到数字c,但是这里不是直接存储c,为了同时表示正负指数以及他们的大小顺序,这里实际存储的是c+127。
Mantissa(23位):尾数部分。也就是上文中提到的数字b。
三部分在内存中的分布如下,用首字母代替类型:
double存储方式
double的存储是将8字节64位划分为了3部分来分别存储正负号,小数部分和指数部分的:
Sign(1位):用来表示浮点数是正数还是负数,0表示正数,1表示负数。
Exponent(11位):指数部分。即上文提到数字c,但是这里不是直接存储c,为了同时表示正负指数以及他们的大小顺序,这里实际存储的是c+127。
Mantissa(52位):尾数部分。也就是上文中提到的数字b。
三部分在内存中的分布如下,用首字母代替类型:
float和double的区别方式
常量的后面加字母F或f,就表示是float型常量,分配4个字节
常量的后面加字母L或l,就表示是double型常量,分配8个字节