C语言(二)———— 数据类型

189 阅读4分钟

所谓类型,就是对数据分配存储单元的安排,包括存储单元的长度(占多少字节)以及数据的存储形式。不同的类型分配不同的长度和存储形式。

数据类型分类

  1. 基础类型

(1)整形类型:基础整形(int)、短整型(short int)、长整型(long int)、双长整型(long long int)、字符型(char)、布尔型(bool)

(2)浮点类型:单精度浮点型(float)、双精度浮点型(double)、复数浮点型(float_complex、double_complex、long_complex)

  1. 枚举类型(enum)

  2. 空类型(void)

  3. 派生类型

(1)指针类型(*)

(2)数组类型([])

(3)结构体类型(struct)

(4)共用体类型(union)

(5)函数类型(function)

整型数据

整形数据的分类

类型win32win64linux32linux64取值范围
short2222-2^7~ 2^7-1
unsigned short22220 ~ 2^16 -1
int4444-2^15~2^15-1
unsigned int44440 ~ 2^32 -1
long4448-2^31~2^31-1
unsigned long44440 ~ 2^32 -1
long long8888-2^31~2^31-1
unsigned long long88880 ~ 2^64 -1

这其中要特别注意long类型,win系统的数据长度都为4字节,而Linux64中数据长度为8字节,二者不统一,所以编写跨平台的软件时尽量不要使用long类型,或者需要对long类型做特殊处理。

关键字signed和unsigned

  • signed 是一般是被默认省略(不用特意表示出来),表示数据是有符号的,即表示可以储存负整数和正整数。

  • unsigned:需要特意表示出来 ,表示数据是没有符号的,即不能表示正负,所以一般认为其表示的是正整数

区别:signed需要用一个字节来储存符号,进而同类型下的signed能存储的数值的绝对值的大小小于unsigned。

注意: 只有整形(包括字符型)数据可以加signed或unsigned,实型数据不能加。

字符型数据

类型WinLinux取值范围
char11-128~127
unsigned char110~255

char类型用于存储字符,但从技术层面看,char是整数类型,因为char类型实际存储的是整数而不是字符。计算机使用数字编码来处理字符,即用特定的字符(一般为ASCII编码),其无符号为unsigned char。

image.png 注意:

(1)在使用有符号字符型变量时,允许存储的值为-128 ~ 127,但字符的代码不可能为负值,所以在存储字符时实际上只用到0 ~ 127这一部分。

(2)127个字符对于某些情况不够用,所以会使用unsigned char,这样就可以存放255个字符代码,但并不适用于所有系统,可以使用以下语句检查ASCII代码从128 ~ 255部分的扩展字符: unsigned char c = 128; printf("%d:%c\n",c,c);

浮点型数据

常用科学计数法是将所有的数字转换成image.png 的形式,其中a的范围是1到9共9个整数,b是小数点后的所有数字,c是10的指数。而计算机中存储的都是二进制数据,所以浮点型数据存储的数字都要先转化成

image.png 由于二进制中最大的数字就是1,所以表示法可以写成

image.png

的形式,浮点型数据要想存储小数就只需要存储(±),b和c就可以了。

float存储方式

float的存储是将4字节32位划分为了3部分来分别存储正负号,小数部分和指数部分的:
Sign(1位):用来表示浮点数是正数还是负数,0表示正数,1表示负数。
Exponent(8位):指数部分。即上文提到数字c,但是这里不是直接存储c,为了同时表示正负指数以及他们的大小顺序,这里实际存储的是c+127。
Mantissa(23位):尾数部分。也就是上文中提到的数字b。 三部分在内存中的分布如下,用首字母代替类型:

image.png

double存储方式

double的存储是将8字节64位划分为了3部分来分别存储正负号,小数部分和指数部分的:
Sign(1位):用来表示浮点数是正数还是负数,0表示正数,1表示负数。
Exponent(11位):指数部分。即上文提到数字c,但是这里不是直接存储c,为了同时表示正负指数以及他们的大小顺序,这里实际存储的是c+127。
Mantissa(52位):尾数部分。也就是上文中提到的数字b。 三部分在内存中的分布如下,用首字母代替类型:

image.png

float和double的区别方式

常量的后面加字母F或f,就表示是float型常量,分配4个字节
常量的后面加字母L或l,就表示是double型常量,分配8个字节