数据类型
一、数据类型分类
二、整数类型
八种整型
| 类型 | 类型简写 | 说明 | 存储大小(字节) |
|---|---|---|---|
| unsigned short int | unsigned short | 无符号短整型 | 2字节 |
| signed short int | short、signed short | 有符号短整型 | 2字节 |
| unsigned int | unsigned | 无符号整型 | 16位:2字节 32位:4字节 |
| signed int | int、signed | 有符号整型 | 16位:2字节 32位:4字节 |
| unsigned long int | unsigned long | 无符号长整型 | 32位:4字节 64位:8字节 |
| signed long int | signed long、long | 有符号长整型 | 32位:4字节 64位:8字节 |
| unsigned long long int | unsigned long long | 无符号长长整型 | 8字节 |
| signed long long int | signed long long、long long | 有符号长长整型 | 8字节 |
[!TIP]
- 不同硬件编译平台的类型存储大小和范围为不同。
- 64位windows下long比较特殊,它是4字节。
- 4字节int类型范围:-2,147,483,648 (- 2^31) 到 2,147,483,647 (2^31 -1)
字面量后缀
| 数据类型 | 字面量后缀 | 数据类型 | 字面量后缀 |
|---|---|---|---|
| int | 无 | unsigned int | U |
| long | L、l | unsigned long | UL、ul |
| long long | LL、ll | unsigned long long | ULL、LLU、llu、ull |
占位符
| 数据类型 | 格式占位符 | 数据类型 | 格式占位符 |
|---|---|---|---|
| int | %d | unsigned int | %u |
| short | %hd | unsigned short | %hu |
| long | %ld | unsigned long | %lu |
| long long | %lld | unsigned long long | %llu |
精准宽度整数类型
定义在标准库<stdint.h>中。精准的字节宽度,提高代码的可移植性
| 类型名称 | 含义 |
|---|---|
| int8_t | 8 位有符号整数 |
| int16_t | 16 位有符号整数 |
| int32_t | 32 位有符号整数 |
| int64_t | 64 位有符号整数 |
| uint8_t | 8 位无符号整数 |
| uint16_t | 16 位无符号整数 |
| uint32_t | 32 位无符号整数 |
| uint64_t | 64 位无符号整数 |
三、浮点类型
| 数据类型 | 说明 | 存储长度 | 有效小数位数 |
|---|---|---|---|
| float | 单精度 | 4字节 | 6~9 |
| double | 双精度 | 8字节 | 15~18 |
| long double | 长双精度 | 32位:10字节 64位:16字节 | 18及以上 |
[!TIP]
- 浮点类型字面量表示形式:
0.512、.512(0可以省略)、5.12e-1(科学计数法,e代表10)- 不同硬件编译平台的类型存储大小和范围为不同。
字面量后缀
| 类型 | 字面量后缀 |
|---|---|
| float | F、f |
| double | 无 |
| long double | L、l |
占位符
| 类型 | 占位符 | 科学计数法 |
|---|---|---|
| float | %f | %e |
| double | %lf | %le |
| long double | %Lf | %Le |
浮点存储方式
计算机中的浮点分为S、M、E三部分,以科学计数法存储:==(-1)^S^∗M∗2^E^==
其中S是符号位,M是尾数位表示精度(1≤M≤2),E是指数位表示范围。
例如:(−1)^0^∗1.011∗2^2^ | S = 0,M = 1.011,E = 2
[!TIP]
IEEE 754规定,在计算机内部保存M时,小数点前默认就是1,因此计算机只保存小数部分
例如:M = 1.01,计算机中只保存01
四、字符类型
-
C语言中,char类型本质是一个整数,是ASCII码中对应的数字,存储长度是 1 个字节,char类型也可以进行数学运算。
-
字符型同样分为signed char(有符号)和unsigned char(无符号),其中signed char取值范围-128 ~ 127,unsigned char取值范围0 ~ 255。默认是否带符号取决于当前运行环境。
-
字符型数据在计算中存储和读取的过程:
-
ASCII码是一种用于表示文本字符的字符编码标准,一共规定了128个字符的编码
字面量
char c1 = 'a';
char c2 = 97;
char c3 = '\n';
特殊的转义字符:
| 转义字符 | 说明 |
|---|---|
| \b | 退格 |
| \n | 换行符 |
| \r | 回车符 |
| \t | 制表符 |
| \” | 双引号 |
| \’ | 单引号 |
| \\ | 反斜杠 |
占位符
printf("%c", 'a');
五、布尔类型
C89标准中没有布尔类型,判断真假以0位假,其他为真。通常借助宏定义。
#define BOOL int
#define TRUE 1
#define FALSE 0
C99标准中定义了_Bool,它是一个字节的整数型,只能赋0或1,非0都会被存储位1。
int main()
{
_Bool a = 0;
_Bool b = 1;
}
C99标准还提供一个头文件<stdbool.h>,定义了bool、true、false。bool代表_Bool、true代表1、false代表0。
#include <stdbool.h>
int main()
{
bool a = false;
bool b = true;
}
六、获取类型存储大小
sizeof是一个==运算符==,能够获取变量、字面量、类型的存储大小,sizeof返回一个size_t类型(unsigned int或unsigned long的别名,具体由编译器决定)的无符号整型,格式占位符为%zu。
//获取字面量存储大小
printf("%zu", sizeof 11);
//数据类型必须加括号
printf("%zu", sizeof (int));
//获取变量存储大小
printf("%zu", sizeof num);
[!IMPORTANT]
printf("%zu", sizeof 'a');获取字符字面量大小时,结果为4。
七、数据类型转换
自动类型转换
运算时,不同类型会进行自动类型转换。
- 范围小的类型自动转换成范围大的类型
- 有符号类型转换为无符号类型
- 整数类型转换为浮点类型
[!IMPORTANT]
char和short即使它们和自己类型运算,也会转换成int型。
赋值时,自动转换成被赋值变量的类型。
强制类型转换
强制类型转换成小范围类型可能会造成数据不准确。
(类型名)变量、常量或表达式