### 3. 数据类型
在 C 语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式。
C 中的类型可分为以下几种:
| 类型 | 说明 |
| --- | --- |
| 基本类型 | 它们是算术类型,包括两种类型:整数类型和浮点类型。 |
|枚举类型 | 它们也是算术类型,被用来定义在程序中只能赋予其一定的离散整数值得变量。 |
|void 类型 | 类型说明符 void 表名没有可用的值 |
|派生类型| 它们包括:指针类型、数组类型、结构类型、共用体类型和函数类型。 |
数组类型和结构类型统称为聚合类型。函数的类型指的是函数返回值的类型。
**整数类型**
下表列出了关于标准整数类型的存储大小和值范围的细节
|类型 | 32 位机/单位:字节 | 64 位机/单位:字节 | 值范围 |
| --- | --- | --- | --- |
| char | 1 | 1 | -128 到 127 或 0 到 255 |
|unsigned char | 1| 1| 0 到 255
|int| 4| 4| -32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647
|unsigned int| 4| 4| 0 到 65,535 或 0 到 4,294,967,295
|short| 2| 2| -32,768 到 32,767 |
|unsigned short |2| 2| 0 到 65,535|
|long | 4 | 8| -2,147,483,648 到 2,147,483,647|
|unsigned long| 4| 8| 0 到 4,294,967,295 |
>[info] 注意: 各种类型的存储大小与系统位数有关,但目前通用的以 64 为系统为主。
以下列出了32位系统与64位系统的存储大小的差别(windows 相同):
![](https://www.runoob.com/wp-content/uploads/2014/09/32-64.jpg)
**浮点类型**
| 类型 | 比特(位)数 | 有效数字 | 取值范围 |
| --- | --- | --- | --- |
|float | 4 | 6~7 | 1.2E-38 到 3.4E+38 |
|double |8 |15~16 |2.3E-308 到 1.7E+308 |
|long double |16 | 18~19| 3.4E-4932 到 1.1E+4932 |
他们的字节,精度,取值范围都可以通过代码打印实现,如下:
```
#include <stdio.h>
//#include <limits.h>
#include <float.h>
#include <stdlib.h>
void main() {
/**
* 整数类型
*/
printf("整数类型 \n");
//char 1 字节
printf("char 存储大小: %lu \n", sizeof(char));
printf("unsinged char 存储大小: %lu \n", sizeof(unsigned char));
//short 2 字节
printf("short 存储大小: %lu \n", sizeof(short));
printf("unsinged short 存储大小: %lu \n", sizeof(unsigned short));
//int 4 字节
printf("int 存储大小: %lu \n", sizeof(int));
printf("unsinged int 存储大小: %lu \n", sizeof(unsigned int));
//long 4/8 字节
printf("long 存储大小: %lu \n", sizeof(long));
printf("unsinged long 存储大小: %lu \n", sizeof(unsigned long));
/**
* 浮点类型
*/
printf("\n 浮点类型 \n");
//float 4 字节 ,精度 6 位小数
printf("float 存储最大字节数:%lu \n", sizeof(float));
printf("float 最小值:%e \n", FLT_MIN);
printf("float 最大值:%e \n", FLT_MAX);
printf("float 精度值:%d \n", FLT_DIG);
//double 8 字节
printf("double 存储最大字节数:%d \n", sizeof(double));
printf("double 最小值:%e \n", DBL_MIN);
printf("double 最大值:%e \n", DBL_MAX);
printf("double 精度值:%d \n", DBL_DIG);
//long double 16 字节
printf("long double 存储最大字节数:%lu byte \n", sizeof(long double));
printf("long double 最小值:%lg \n", LDBL_MIN);
printf("long double 最大值:%lg \n", LDBL_MAX);
printf("long double 精度值:%d \n", LDBL_DIG);
}
```
输出结果
```
整数类型
char 存储大小: 1
unsinged char 存储大小: 1
short 存储大小: 2
unsinged short 存储大小: 2
int 存储大小: 4
unsinged int 存储大小: 4
long 存储大小: 4
unsinged long 存储大小: 4
浮点类型
float 存储最大字节数:4
float 最小值:1.175494e-38
float 最大值:3.402823e+38
float 精度值:6
double 存储最大字节数:8
double 最小值:2.225074e-308
double 最大值:1.797693e+308
double 精度值:15
long double 存储最大字节数:8 byte
long double 最小值:2.22507e-308
long double 最大值:1.79769e+308
long double 精度值:15
请按任意键继续. . .
```
可以通过 sizeof 关键字来获取数据类型占用内存的大小。
上面代码可以看到了打印中出现了很多不识的 scanf() 格式控制符,我总结了一个表,可以参考下:
| 格式控制符 | 说明 |
| --- | --- |
| %c | 读取一个单一的字符 |
|%hd、%d、%ld | 读取一个十进制整数,并分别赋值给 short、int、long 类型
|%ho、%o、%lo | 读取一个八进制整数(可带前缀也可不带),并分别赋值给 short、int、long 类型
|%hx、%x、%lx | 读取一个十六进制整数(可带前缀也可不带),并分别赋值给 short、int、long 类型
|%hu、%u、%lu| 读取一个无符号整数,并分别赋值给 unsigned short、unsigned int、unsigned long 类型
|%f、%lf |读取一个十进制形式的小数,并分别赋值给 float、double 类型
|%e、%le | 读取一个指数形式的小数,并分别赋值给 float、double 类型
|%g、%lg| 既可以读取一个十进制形式的小数,也可以读取一个指数形式的小数,并分别赋值给 float、double 类型
|%s | 读取一个字符串(以空白符为结束)
- 前言
- JNI基础知识
- C语言知识点总结
- ①基本语法
- ②数据类型
- 枚举类型
- 自定义类型(类型定义)
- ③格式化输入输出
- printf函数
- scanf函数
- 编程规范
- ④变量和常量
- 局部变量和外部变量
- ⑤类型转换
- ⑥运算符
- ⑦结构语句
- 1、分支结构(选择语句)
- 2、循环结构
- 退出循环
- break语句
- continue语句
- goto语句
- ⑧函数
- 函数的定义和调用
- 参数
- 函数的返回值
- 递归函数
- 零起点学通C语言摘要
- 内部函数和外部函数
- 变量存储类别
- ⑨数组
- 指针
- 结构体
- 联合体(共用体)
- 预处理器
- 预处理器的工作原理
- 预处理指令
- 宏定义
- 简单的宏
- 带参数的宏
- 预定义宏
- 文件包含
- 条件编译
- 内存中的数据
- C语言读文件和写文件
- JNI知识点总结
- 前情回顾
- JNI规范
- jni开发
- jni开发中常见的错误
- JNI实战演练
- C++(CPP)在Android开发中的应用
- 掘金网友总结的音视频开发知识
- 音视频学习一、C 语言入门
- 1.程序结构
- 2. 基本语法
- 3. 数据类型
- 4. 变量
- 5. 常量
- 6. 存储类型关键字
- 7. 运算符
- 8. 判断
- 9. 循环
- 10. 函数
- 11. 作用域规则
- 12. 数组
- 13. 枚举
- 14. 指针
- 15. 函数指针与回调函数
- 16. 字符串
- 17. 结构体
- 18. 共用体
- 19. typedef
- 20. 输入 & 输出
- 21.文件读写
- 22. 预处理器
- 23.头文件
- 24. 强制类型转换
- 25. 错误处理
- 26. 递归
- 27. 可变参数
- 28. 内存管理
- 29. 命令行参数
- 总结
- 音视频学习二 、C++ 语言入门
- 1. 基本语法
- 2. C++ 关键字
- 3. 数据类型
- 4. 变量类型
- 5. 变量作用域
- 6. 常量
- 7. 修饰符类型
- 8. 存储类
- 9. 运算符
- 10. 循环
- 11. 判断
- 12. 函数
- 13. 数学运算
- 14. 数组
- 15. 字符串
- 16. 指针
- 17. 引用
- 18. 日期 & 时间
- 19. 输入输出
- 20. 数据结构
- 21. 类 & 对象
- 22. 继承
- 23. 重载运算符和重载函数
- 24. 多态
- 25. 数据封装
- 26. 接口(抽象类)
- 27. 文件和流
- 28. 异常处理
- 29. 动态内存
- 30. 命名空间
- 31. 预处理器
- 32. 多线程
- 总结
- 音视频学习 (三) JNI 从入门到掌握
- 音视频学习 (四) 交叉编译动态库、静态库的入门学习
- 音视频学习 (五) Shell 脚本入门
- 音视频学习 (六) 一键编译 32/64 位 FFmpeg 4.2.2
- 音视频学习 (七) 掌握音频基础知识并使用 AudioTrack、OpenSL ES 渲染 PCM 数据
- 音视频学习 (八) 掌握视频基础知识并使用 OpenGL ES 2.0 渲染 YUV 数据
- 音视频学习 (九) 从 0 ~ 1 开发一款 Android 端播放器(支持多协议网络拉流/本地文件)
- 音视频学习 (十) 基于 Nginx 搭建(rtmp、http)直播服务器
- 音视频学习 (十一) Android 端实现 rtmp 推流
- 音视频学习 (十二) 基于 FFmpeg + OpenSLES 实现音频万能播放器
- 音视频学习 (十三) Android 中通过 FFmpeg 命令对音视频编辑处理(已开源)