C语言中的数据类型

整型数据

(1)基本整型(int型)

存储方式:

编译系统给int型数据分配2个字节或者4个字节

在存储单元中的存储方式是使用整数的补码形式存放。

正数的补码是是此数的二进制形式

负数的补码是负数的绝对值的二进制形式按位取反再加1

在存放整数的存储单元中,最左边一位是用来表示符号的,该位为0表示正数,该位为1表示负数。

表示范围:

如果给整型变量分配2个字节,则存储单元中能够存放的最大正数为0111111111111111,即

\[2^{15}-1=32767 \]

能存放的最小负数为1000000000000000,即

\[-2^{15}=-32768 \]

如果给整型变量分配4个字节,则存储单元中能够存放的最大正数为:

\[2^{31}-1=2147183647 \]

能存放的最小负数为1000000000000000,即

\[-2^{31}=-2147483648 \]

超过以上范围,则表现为数据的溢出。

(2)短整型(short int)

在Visual C++中,编译系统分配给int类型4个字节,分配给短整型2个字节,数据存储方式与int类型相同,数值范围为:

\[-32767 \leftrightarrow 32768 \]

(3)长整型(long int)

在Visual C++中,编译系统分配给long int类型4个字节,32位,数值范围为:

\[-2147483648 \leftrightarrow 2147483647 \]

(4)双长整型(long long int)

编译系统一般分配给long long int类型8个字节,为C99新增类型,许多编译系统尚未实现。

(补充)

C语言并没有具体规定各种类型数据所占用的存储单元的长度,而是由各个编译系统自己决定的,C语言只要求long型数据长度不短于int类型,short类型不长于int类型。不同编译系统中对于不同的整型数据类型的长度规定不同,故将一个程序从A编译系统搬移到B编译系统时,要注意不同编译系统对数据类型长度的规定,防止数据的溢出情况。

整型数据的符号属性

上面介绍的四种整型数据类型的变量值都是以补码的形式进行存储的,存储单元的第一个二进制符号表示符号,不同的整型数据类型有不同的负数到正数的范围,以Visual C++为例,整型数据常见的存储空间喝值的数据范围为下:

类型 字节数 取值范围
[signed] int 4 -2147483648~2147483647
unsigned int 4 0~4294967295
[signed] short [int] 2 -32768~32767
unsigned short [int] 2 0~65535
[signed] long [int] 4 -2147483648~2147483647
unsigned long [int] 4 0~4294967295
[signed] long long [int] 8 -9223372036845775808~9223372036854775807
unsigned long long [int] 8 0~18446744073709551615

"[ ]"内的内容是可选的,

在实际应用中,如果变量存储的值只有正数,为了充分利用变量的值的范围,可以将变量定义为无符号数据类型,

其中表格的最后两行中的[signed] long long [int]和unsigned long long [int]为C99新增,

有符号数据类型中存储单元的最高为表示数值的符号(0为正,1为负),

如果指定数据类型为无符号(unsigned)类型,则存储单元的全部二进制都用来存放数据,不能用来存储负数,

无符号整型变量中存放的正数的范围比一般整型变量中正数的范围扩大了一倍。

(补充)

只有整型数据和字符型数据可以加上signed和unsigned修饰符,不能给无符号数据类型赋负值。

无符号十进制数的输出用%u作占位符

字符型数据

各种字符集的基本集包括127个字符,可以用7个二进制位表示,C语言中指定用一个字节8位来存储一个字符,其中字节的第一位为0,

‘A’的ASCII码为65,‘a’的ASCII码为97,相隔32,‘1’的ASCII码为49,字符‘1’和整数1是不同的概念,

字符变量

字符变量用char定义,字符变量实质上是一个字字节的整型变量,也可以将0~127之间的一个整数赋给一个字符变量

char c='?' ;

c是字符变量,实质上是一个字节的整型变量,可以用%d和%c进行输出,用%d输出,输出的是?对应的ASCII码63,用%c输出,输出的是字符'?'

字符类型也属于整型,也可以用signed和unsigned进行修饰

将char类型改为unsigned char把可用的字符由127个拓展到255个,但是不同的系统有不同的拓展字符集。

浮点型数据

浮点型数据用来表示具有小数点的实数,包括单精度浮点型float ,双精度浮点型double ,长双精度浮点型long double,

C语言中,实数以指数的形式存放在存储单元中

(1)单精度浮点型float

系统为float类型分配4个字节,数值以规范化的二进制指数形式存放在存储单元中,系统将实型数据存储为小数部分和指数部分分别存放。

如3.14159的存储方式为:

数值符号 小数部分(此处实际为二进制) 指数部分
+ .314159 1(表示10^1)

具体在4个字节32位中,具体以多少位表示小数部分,以多少位表示指数部分,C语言标准并未具体规定,各个编译系统标准不同,

小数部分占用的位数越多,则数的有效数字越多,存储的精度也就越高,

指数部分占用的位数越多,则能表示的数值范围也就越大。

(2)双精度浮点型double

双精度浮点型使用8个字节存储一个double型数据,扩大了能表示的数值范围,可以得到15位有效数字,数值范围为:

\[-1.7*10^{-308}\leftrightarrow 1.7*10^{308} \]

在C语言进行浮点数的算数运算时,将float型数据自动转换为double型,再进行运算。

(3)长双精度型long double 型

Visual C++对double型和 long double型都分配8个字节,不同编译系统对long double型数据处理方式不同。