Reference:
参考:C语言入门经典(第四版)
Guide:
了解C语言中的基本数据类型和类型之间的转换。
一、字符型
在所有的数据类型中,char类型占用的内存空间最少,它一般只需要一个字节。存储在char类型变量的整数可以表示为带符号或无符号的值,这取决于编译器。若表示为无符号的类型,则存储在char类型变量的值可以是0~255.若表示为带符号的类型,则可以为-128~+127。
char类型的变量有双重性:可以把他解释为一个字符,也可以解释为一个整数。
比如,字符'A'可以转换为整形的65,当然这是在ASCII码当中的,如果你的计算机环境不是使用的ASCII码的话,就另当别论,不过一般都是ASCII码。
还有一个宽字符类型,定义形式如下
wchar_t c=L'a'; 不过要导入头文件<stddef.h>
wchar_t类型的变量存储多字节字符码,一般占用两个字节。在处理Unicode字符时,就需要使用wchar_t类型。
二、整形
类型名称 | 字节数 | 取值范围 | 使用注意 |
short int 或short | 2 | -32768 ~ +32767 ( -2^15 ~ 2^15-1) | |
int | 4 | -2147438648 ~ +2147438648( -2^31 ~ 2^31-1) | |
long int 或long | 4 | -2147438648 ~ +2147438648( -2^31 ~ 2^31-1) | 尾缀 L |
long long int 或long long | 8 | -9223372036854775808 ~ +9223372036854775807( -2^63 ~ 2^63-1) | 尾缀 LL |
类型名称 | 字节数 | 取值范围 | 使用注意 |
unsigned short int 或unsigned short | 2 | 0~ +65535 ( 0~ 2^16-1) | |
unsigned int | 4 | 0 ~ +4294967295( 0 ~ 2^32-1) | |
unsigned long int 或unsigned long | 4 | 0 ~ +4294967295( 0 ~ 2^32-1) | 尾缀 UL |
unsigned long long int 或unsigned long long | 8 | 0 ~ +18446744073709551615( 0 ~ 2^64-1) | 尾缀 ULL |
如果是特殊进制的数,还有特殊的规定
八进制:前面为0的 , 如072 034 都是八进制的数,在比如072L,代表一个八进制的长整数类型。072UL,代表一个八进制的无符号长整数类型
十六进制:前面带0x或0X 如0x456 0xAD3 都是十六进制的数
注意:在一台计算机上面,给定类型的变量占用的内存空间总是相同的,但是在一些情况下,给定类型的变量在一台计算机上占用的内存比另一台计算机上多。这是因为C语言的规范让编译器的作者确定给定类型变量占用多少内存空间。因此编译器的作者就可以选择变量的大小,以满足计算机的硬件要求。一般情况下,int类型的长度和计算机的字长是一样的。
在C语言的国际标准中,整数类型的唯一要求是,上表中的每种类型占用的内存空间都不少于其上的类型。
三、浮点型
类型名称 | 字节数 | 取值范围 | 使用注意 |
float | 4 | ±3.4E38(精确到6位小数) | 带后缀f |
double | 8 | ±1.7E308(精确到15位小数) | |
long double | 12 | ±1.19E4932(精确到18位小数) | 带后缀L |
四、布尔型
bool值,代表逻辑上面的真或者假,在C语言里面就是true和false。
实际上,bool值同样可以转换为整形,true为1,false为0.
同样,整形也可以转换为bool值,只不过稍微有点不同。非0为true,0为false。
五、数值之间的类型转换
类型转换分为两种,强制类型转换和隐式类型转换
1、隐式类型转换
只有两个操作数的类型相同,计算机才能执行二元算术操作(加减乘除和取模)。在二元算术运算中使用不同类型的操作数,编译器就会把其中一个值域较小的操作数类型转换为另一个操作数的类型,这称为隐式类型转换(implicitconversion).
编译器按顺序采用如下规则,确定要使用的隐式类型转换:
(1)、如果一个操作数的类型是long double,就把另一个操作数转换为long double类型(2)、否则,如果一个操作数的类型是double,就把另一个操作数转换为double类型
(3)、否则,如果一个操作数的类型是float,就把另一个操作数转换为float类型
(4)、否则,如果两个操作数的类型都是带符号的整数或无符号的整数,就把级别较低的操作数转换为另一个操作数的类型。无符号整数类型的级别从低到高为:
singed char,short,int ,long ,long long
每个无符号整数类型的级别都与对应的带符号整数类型相同,所以unsigned int类型的级别与int类型相同
(5)、否则,如果带符号整数类型的操作数级别低于无符号整数类型的级别,就把带符号整数类型的操作数转换为无符号整数类型。
(6)、否则,如果带符号整数类型的值域包含了无符号整数类型所表示的值,就把无符号整数类型转换为带符号整数类型。
(7)、否则,两个操作数都转换为带符号整数类型对应的无符号整数类型。
2、强制类型转换
强制类型转换的格式
(要转换的类型)数据
比如:
double d=5.4;
int a =(int)d;
强制类型转换的数据的类型,如果不能符合上面隐式转换的规则,那么在转换的时候,就有可能会丢失数据或丢失精度。
一、字符型
在所有的数据类型中,char类型占用的内存空间最少,它一般只需要一个字节。存储在char类型变量的整数可以表示为带符号或无符号的值,这取决于编译器。若表示为无符号的类型,则存储在char类型变量的值可以是0~255.若表示为带符号的类型,则可以为-128~+127。
char类型的变量有双重性:可以把他解释为一个字符,也可以解释为一个整数。
比如,字符'A'可以转换为整形的65,当然这是在ASCII码当中的,如果你的计算机环境不是使用的ASCII码的话,就另当别论,不过一般都是ASCII码。
还有一个宽字符类型,定义形式如下
wchar_t c=L'a'; 不过要导入头文件<stddef.h>
wchar_t类型的变量存储多字节字符码,一般占用两个字节。在处理Unicode字符时,就需要使用wchar_t类型。
二、整形
类型名称 | 字节数 | 取值范围 | 使用注意 |
short int 或short | 2 | -32768 ~ +32767 ( -2^15 ~ 2^15-1) | |
int | 4 | -2147438648 ~ +2147438648( -2^31 ~ 2^31-1) | |
long int 或long | 4 | -2147438648 ~ +2147438648( -2^31 ~ 2^31-1) | 尾缀 L |
long long int 或long long | 8 | -9223372036854775808 ~ +9223372036854775807( -2^63 ~ 2^63-1) | 尾缀 LL |
类型名称 | 字节数 | 取值范围 | 使用注意 |
unsigned short int 或unsigned short | 2 | 0~ +65535 ( 0~ 2^16-1) | |
unsigned int | 4 | 0 ~ +4294967295( 0 ~ 2^32-1) | |
unsigned long int 或unsigned long | 4 | 0 ~ +4294967295( 0 ~ 2^32-1) | 尾缀 UL |
unsigned long long int 或unsigned long long | 8 | 0 ~ +18446744073709551615( 0 ~ 2^64-1) | 尾缀 ULL |
如果是特殊进制的数,还有特殊的规定
八进制:前面为0的 , 如072 034 都是八进制的数,在比如072L,代表一个八进制的长整数类型。072UL,代表一个八进制的无符号长整数类型
十六进制:前面带0x或0X 如0x456 0xAD3 都是十六进制的数
注意:在一台计算机上面,给定类型的变量占用的内存空间总是相同的,但是在一些情况下,给定类型的变量在一台计算机上占用的内存比另一台计算机上多。这是因为C语言的规范让编译器的作者确定给定类型变量占用多少内存空间。因此编译器的作者就可以选择变量的大小,以满足计算机的硬件要求。一般情况下,int类型的长度和计算机的字长是一样的。
在C语言的国际标准中,整数类型的唯一要求是,上表中的每种类型占用的内存空间都不少于其上的类型。
三、浮点型
类型名称 | 字节数 | 取值范围 | 使用注意 |
float | 4 | ±3.4E38(精确到6位小数) | 带后缀f |
double | 8 | ±1.7E308(精确到15位小数) | |
long double | 12 | ±1.19E4932(精确到18位小数) | 带后缀L |
四、布尔型
bool值,代表逻辑上面的真或者假,在C语言里面就是true和false。
实际上,bool值同样可以转换为整形,true为1,false为0.
同样,整形也可以转换为bool值,只不过稍微有点不同。非0为true,0为false。
五、数值之间的类型转换
类型转换分为两种,强制类型转换和隐式类型转换
1、隐式类型转换
只有两个操作数的类型相同,计算机才能执行二元算术操作(加减乘除和取模)。在二元算术运算中使用不同类型的操作数,编译器就会把其中一个值域较小的操作数类型转换为另一个操作数的类型,这称为隐式类型转换(implicitconversion).
编译器按顺序采用如下规则,确定要使用的隐式类型转换:
(1)、如果一个操作数的类型是long double,就把另一个操作数转换为long double类型(2)、否则,如果一个操作数的类型是double,就把另一个操作数转换为double类型
(3)、否则,如果一个操作数的类型是float,就把另一个操作数转换为float类型
(4)、否则,如果两个操作数的类型都是带符号的整数或无符号的整数,就把级别较低的操作数转换为另一个操作数的类型。无符号整数类型的级别从低到高为:
singed char,short,int ,long ,long long
每个无符号整数类型的级别都与对应的带符号整数类型相同,所以unsigned int类型的级别与int类型相同
(5)、否则,如果带符号整数类型的操作数级别低于无符号整数类型的级别,就把带符号整数类型的操作数转换为无符号整数类型。
(6)、否则,如果带符号整数类型的值域包含了无符号整数类型所表示的值,就把无符号整数类型转换为带符号整数类型。
(7)、否则,两个操作数都转换为带符号整数类型对应的无符号整数类型。
2、强制类型转换
强制类型转换的格式
(要转换的类型)数据
比如:
double d=5.4;
int a =(int)d;
强制类型转换的数据的类型,如果不能符合上面隐式转换的规则,那么在转换的时候,就有可能会丢失数据或丢失精度。