一、基础数据类型
基本数据类型有三种:
- 字符(char)
- 整数(int)
- 浮点数(float)
二、字符数据类型
2.1、字符类型声明
// C 语言规定,字符常量必须放在单引号里面。
char c = 'A';
2.2、字符类型与整数
在计算机内部,字符类型使用一个字节(8位)存储。C 语言将其当作整数处理,所以字符类型就是宽度为一个字节的整数。每个字符对应一个整数(由 ASCII 码确定),比如B对应整数66。
char c = 66;
// 等同于
char c = 'B';
//输出 字符代表的整数
printf("%d\n", c);
2.3、转义字符
单引号本身也是一个字符,如果要表示这个字符常量,必须使用反斜杠转义。
char t = '\'';
ASCII 码定义的一些无法打印的控制字符
- \a:警报,这会使得终端发出警报声或出现闪烁,或者两者同时发生。
- \b:退格键,光标回退一个字符,但不删除字符。
- \f:换页符,光标移到下一页。在现代系统上,这已经反映不出来了,行为改成类似于\v。
- \n:换行符。
- \r:回车符,光标移到同一行的开头。
- \t:制表符,光标移到下一个水平制表位,通常是下一个8的倍数。
- \v:垂直分隔符,光标移到下一个垂直制表位,通常是下一行的同一列。
- \0:null 字符,代表没有内容。注意,这个值不等于数字0。
进制表示字符
- \nn:字符的八进制写法,nn为八进制值。
- \xnn:字符的十六进制写法,nn为十六进制值。
三、整数数据类型
3.1、简介
3.1.1、整数类型声明
int a = 1;
3.1.2、整数类型范围
- 2个字节,16位:-32,768 到 32,767。
- 4个字节,32位:-2,147,483,648 到 2,147,483,647。
- 8个字节,64位:-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807。
3.2、整数正负数
- signed : 表示一个类型带有正负号,包含负值
- unsigned: 表示该类型不带有正负号,只能表示零和正整数
- 对于int类型,默认是带有正负号的,也就是说int等同于signed int。
- 整数变量声明为unsigned的好处是,同样长度的内存能够表示的最大整数值,增大了一倍。比如,16位的signed int最大值为32,767,而unsigned int的最大值增大到了65,535。 ```c signed int a; // 等同于 int a;
//声明不带正负号的整数 unsigned int a;
signed char c; // 范围为 -128 到 127 unsigned char c; // 范围为 0 到 255
//非负数整数 unsigned int b =-10; printf(“%u\n”,b); //会造成溢出
<a name="jZ8kb"></a>
### 3.3、整数的子类型
- short int(简写为short):占用空间不多于int,一般占用2个字节(整数范围为-32768~32767)。
- long int(简写为long):占用空间不少于int,至少为4个字节。
- long long int(简写为long long):占用空间多于long,至少为8个字节。
```c
//声明
short int a;
long int b;
long long int c;
//C 语言允许省略int
short a;
long b;
long long c;
3.4、整数类型的极限值
C 语言的头文件limits.h提供了相应的常量
- SCHAR_MIN,SCHAR_MAX:signed char 的最小值和最大值。
- SHRT_MIN,SHRT_MAX:short 的最小值和最大值。
- INT_MIN,INT_MAX:int 的最小值和最大值。
- LONG_MIN,LONG_MAX:long 的最小值和最大值。
- LLONG_MIN,LLONG_MAX:long long 的最小值和最大值。
- UCHAR_MAX:unsigned char 的最大值。
- USHRT_MAX:unsigned short 的最大值。
- UINT_MAX:unsigned int 的最大值。
- ULONG_MAX:unsigned long 的最大值。
- ULLONG_MAX:unsigned long long 的最大值。
```c
include
include
printf(“int 最小值 %d”,INT_MIN); printf(“int 最大值 %d”,INT_MAX);
<a name="Qg02B"></a>
### 3.5、整数进制
- 八进制使用0作为前缀,比如017、0377。
- 十六进制使用0x或0X作为前缀,比如0xf、0X10。
printf()的进制相关占位符如下
- %d:十进制整数。
- %o:八进制整数。
- %x:十六进制整数。
- %#o:显示前缀0的八进制整数。
- %#x:显示前缀0x的十六进制整数。
- %#X:显示前缀0X的十六进制整数。
<a name="wJYmF"></a>
## 四、浮点数数据类型
任何有小数点的数值,都会被编译器解释为浮点数。所谓“浮点数”就是使用 m * b^e 的形式,存储一个数值,m是小数部分,b是基数(通常是2),e是指数部分。
<a name="RPHlN"></a>
### 4.1、浮点数声明
```c
float c = 10.5;
4.2、浮点数类型长度
- float:占用4个字节(32位)
- double:占用8个字节(64位),至少提供13位有效数字。
- long double:通常占用16个字节。
五、布尔类型
5.1、简介
C 语言原来并没有为布尔值单独设置一个类型,而是使用整数0表示伪,所有非零值表示真。
头文件 stdbool.h 定义了另一个类型别名bool,并且定义了true代表1、false代表0。
int x = 1;
if (x) {
printf("x is true!\n");
}
5.2、声明
#include <stdbool.h>
bool flag = false;
六、sizeof 运算符
sizeof是 C 语言提供的一个运算符,返回某种数据类型或某个值占用的字节数量。
// 参数为数据类型
int x = sizeof(int);
// 参数为变量
int i;
//返回得到int类型占用的字节数量(通常是4或8)
sizeof(i);
// 参数为数值
//第三个示例返回浮点数3.14占用的字节数量,
//由于浮点数的字面量一律存储为 double 类型
//所以会返回8,因为 double 类型占用的8个字节。
sizeof(3.14);
七、类型转换
7.1、赋值运算
7.1.1、浮点数赋值给整数变量
// 浮点数赋予整数变量时,C 语言直接丢弃小数部分,而不是四舍五入。
int x = 3.14;
7.1.2、整数赋值给浮点数变量
//整数赋值给浮点数变量时,会自动转为浮点数。
float y = 12 * 2;
7.1.3、窄类型赋值给宽类型
//字节宽度较小的整数类型,赋值给字节宽度较大的整数变量时
//会发生类型提升,即窄类型自动转为宽类型。
char x = 10;
int i = x + y;
7.1.4、宽类型赋值给窄类型
//字节宽度较大的类型,赋值给字节宽度较小的变量时,会发生类型降级,自动转为后者的类型。
//这时可能会发生截值(truncation),系统会自动截去多余的二进制位,导致难以预料的结果。
// i(二进制形式为101000001,共9位)
// ch 只能容纳8位 变成了01000001
int i = 321;
char ch = i; // ch 的值是 65 (321 - 256)
7.2、混合类型的运算
- (1)整数与浮点数混合运算时,整数转为浮点数类型,与另一个运算数类型相同。
- (2)不同的浮点数类型混合运算时,宽度较小的类型转为宽度较大的类型,比如float转为double,double转为long double。
- 3)不同的整数类型混合运算时,宽度较小的类型会提升为宽度较大的类型。
7.3、函数
函数的参数和返回值,会自动转成函数定义里指定的类型。
int dostuff(int, unsigned char);
char m = 42;
unsigned short n = 43;
long long int c = dostuff(m, n);
7.4、类型的显式转换
//手动转换为 long int 类型
long int y = (long int) 10 + 12;
八、可移植类型
程序员有时控制准确的字节宽度,这样的话,代码可以有更好的可移植性,头文件stdint.h创造了一些新的类型别名。
8.1、精确宽度类型(exact-width integer type)
- int8_t:8位有符号整数。
- int16_t:16位有符号整数。
- int32_t:32位有符号整数。
- int64_t:64位有符号整数。
- uint8_t:8位无符号整数。
- uint16_t:16位无符号整数。
- uint32_t:32位无符号整数。
-
8.2、最小宽度类型(minimum width type)
int_least8_t
- int_least16_t
- int_least32_t
- int_least64_t
- uint_least8_t
- uint_least16_t
- uint_least32_t
- uint_least64_t
8.3、最快的最小宽度类型(fast minimum width type)
- int_fast8_t
- int_fast16_t
- int_fast32_t
- int_fast64_t
- uint_fast8_t
- uint_fast16_t
- uint_fast32_t
- uint_fast64_t
8.4、可以保存指针的整数类型
- intptr_t:可以存储指针(内存地址)的有符号整数类型。
-
8.5、最大宽度整数类型,用于存放最大的整数
intmax_t:可以存储任何有效的有符号整数的类型。
- uintmax_t:可以存放任何有效的无符号整数的类型。