数据类型: 即 对 不同类型的数 的 表示 和 存储 。有 整数类型 和精确类型
char 字符型 8bit 1字节 存储这个数 0-255 共256个数
short 半字类型 16bit 2字节 0-2^16-1 = 65535
int 整型 32bit 4字节 0-2^32-1 = 4,294,967,295
long 长整型 64bit 8字节 0-2^64-1 =
int 与 long 存储大小
一些8位单片机 51 int 2字节 long 4字节
一些32位单片机 stm32 或 LinuxC int 4字节 long 8字节
signed 有符号类型 不写默认是有符号类型
unsigned 无符号类型
signed char 有符号字符型 -128 ~ + 127
unsighed char 无符号字符型
有符号与无符号的区别
负数如何表示 -2 -10 -1
有符号数 最高bit 作为符号位 0 正数 1 负数
signed char -128 ~ 0 ~ +127
补码形式 存储有符号类型
LinuxC中:
不写 signed 默认 都是有符号 gcc
单片机C中 arm gcc
char 不写 默认无符号类型
除char类型 外 其他不写signed 默认是有符号类型
最高位 为 符号位 其余位 存储值 若值是负数 补码
负数值 = 补码取反 +1
强类型语言:
C语言: 任何变量或存储空间 必要先定义(给定类型 ) 然后才能使用
且 使用过程中 类型不不能更改
小数: 2.5 0.71231 0.0000000000000012 21873541623584713527412348234.12341341
非精确类型: 数据 有 有效位数 超过有效位数的数据丢弃
浮点类型存储与表示:
使用幂指数方式存储小数
0.25 * 10^-1
0.71231 * 10^0
0.12 * 10^-14
0.21873541 * 10^29
浮点数存储:
flaot 单精度浮点型 4字节存储 有效十进制位数 约6位
最高bit 符号位 8bit 幂指数位 23 位有效位
double 双精度浮点型 8字节存储 有效十进制位数 约15位
最高bit 符号位 11bit 幂指数位 52 位有效位
逻辑上:
布尔类型 bool 真 假 有一些运算 或操作 其结果是布尔类型 关系运行 逻辑运算
C语言中 真 非0 为真 0假
void 类型 空类型
C语言中的常量
常量: 程序运行过程中 始终不变的量
整型常量: 5 10 -5 整数值 8
浮点常量: 2.5 -3.7
指数常量: 3.0e-26 => 3*10^-26
字符常量: 单个英文字符 'a' '8' === 56 ASCII
字符串常量: 多个字符放在一起 "hello world"
在内存中 存储的是 字符的 编码 连续存储
标识常量(宏定义): 本质是给 常量 定义一个字符串形式的 别名
#define 宏名 值
#define PI 3.14
#define WATER 3.0e-26
字符在计算机中的存续:
将非数值类型数据 进行 编码 转换为 数值类型 存储;
英文字符 与 数字 符号 ASCII 编码标准
编码
0-31 表示一些 文本动作
32-126 有对应字符
解码 字库
65 ====> 'A'
变量
变量: 程序运行过程中 可能改变的量
其本质 即 给一个 内存空间 命名 通过该名字访问内存
C语言中 的 变量 1. 先定义在使用 2. 定义时给定类型 一旦定义完成 其类型将不能改变
示例 变量的定义:
存储类型 数据类型 变量名;
auto int a; // 即表示 声明一段4字节内存空间 命名为 a
若省略存储类型 即 auto 类型
存储类型: 决定了 变量存储的位置
C语言内存结构:
常量或代码: a.out
1.代码段: 存储代码 即编译的二进制指令 只读
2.常量区: 存储程序中的 常量 "" 的部分 常量字符串 只读
可以使用 const 关键字 修饰全局变量 将该变量的存储位置 变更为常量区
变量:
3.静态区: 可读可写 只能被初始化 一次 在程序开始运行时
该区域变量 将从程序开始 一直存在到程序结束
未初始化的 静态区变量 都默认初始化为0
4.堆区: 有程序员 在程序运行时 可以手动 动态(长度不确定)申请或释放的 内存
5.栈区: 有程序运行时 自动(函数形参或局部变量) 申请或释放的 内存
未初始化的栈区堆区变量 其初始值不确定
由系统维护的数据:
6.系统区: LinuxC有, 存储操作系统对于该进程的 一些数据
进程控制块,内存占用情况, 环境变量等 只读
全局变量: 变量定义的位置 在函数外(不在任何函数内 {}) 可以在整个程序中使用
局部变量: 变量定义的位置 在函数内( 在 {} 中定义的) 只能在{}内部使用
auto 修饰全局变量 该变量存储与 静态区
auto 修饰局部变量 该变量存储与 栈区
const 修饰全局变量 该变量存储与 常量区
static 修饰局部变量 该变量存储与 静态区
只能在{}内使用 只能被初始化 一次 在程序开始运行时
static 修饰全局变量 该变量存储与 静态区
只能在当前C文件中使用 只能被初始化 一次 在程序开始运行时
多用于防止全局变量重名 导致的问题
static 修饰函数 该函数只能在 本文件内使用
变量赋值 变量名 = 值; 即 向内存中 写入值
变量初始化 即 定义时 赋值 ;
extern 修饰全局变量 表示外部 引入 存储类型 不开辟新的内存 空间
是一种声明
extern 函数 表示引入外部文件实现的 函数
register 寄存器类型 声明 表示变量 尽量使用寄存器存储
通常用于修饰 在一段代码中 使用极其频繁的 量
该存储类型的变量 不能取地址 &
变量名: 由编程者 自己定义的名字
程序中 变量名 函数名 宏名 都是 标识符
命名规范:
1. 只能由 字母 数字 下划线 组成 区分大小写
2. 不能由数字开头
3. 不能与 关键字重名 32个
int 张3; int 7a; int char; 不行
int _abc; int printf; 可以
库标识符: 库中 有对于该标识的定义
系统标识符: 由编译定义了的 include
数据类型的转换: 将类型不匹配 的数据 转换为 对应匹配类型的数据格式
隐式类型转换: 有编译器 自动完成 一些默认转换模式
强制类型转换: 编程者 手动进行的 强制性的类型 转换
变量 或 值 前 使用(目标类型)
类型的转换过程:
float ---> int 舍弃小数 取整操作
int ---> float 整型(精确类型) 小数(非精确类型) 精度会丢失
int ---> char 溢出部分舍弃 宽存储空间 转换为 小存储空间
int ---> short
小存储空间 转换为 宽存储空间 不影响
整型与浮点型 参与运算时 隐式类型转换 会统一转换为浮点型计算
有符号数 无符号数 强制类型转换时 存储内容 完全没有改变 但影响计算
C语言中标准输入与输出:
标准输入: 程序终端 输入的内容
标准输出: 程序输出 到终端显示
输出: 使用man 函数名 查询该函数
putc(); 输出一个字符 'a'
putchar(); 与putc一样
puts(); 输出一个字符串 "hello world"
格式化输出函数
printf();
#include <stdio.h>
int printf(const char *format, ...);
int sprintf(char *str, const char *format, ...);
int snprintf(char *str, size_t size, const char *format, ...);
sprintf/snprintf 即格式化后 输出到 指定内存容器str中
返回值: 成功 返回 格式化后输出的字符个数
... 变长参数个数
使用: format 格式控制字符串 "a=%d\n",a 其中 a=\n 原样输出
%d 格式占位控制符
%d 输出整型有符号数 以10进制方式显示
%x 输出整型无符号数 以16进制方式显示
%u 输出整型无符号数 以10进制方式显示
%c 输出一个 字符型数 以字符方式显示
%s 输出一个字符串 以\0 作为结束符
%f 输出一个浮点类型 以10进制方式
%% 输出%本身
附加格式说明符(修饰符):
%8d 输出整型有符号数 以10进制方式显示
在数据值宽度低于8个字符位置时 填充空格维持8个字符位置
-8 向左对齐
8 默认右对齐
%.2f 输出一个浮点类型 以10进制方式 保留2位小数 四舍五入
%ld 输出整型有符号数 宽度为8字节long 以10进制方式显示
%lf 输出 double 类型的浮点数
标准输入:
#include <stdio.h>
int fgetc(FILE *stream); //得到一个字符
int getc(FILE *stream); //得到一个字符
int getchar(void); //得到一个字符
char *fgets(char *s, int size, FILE *stream); //得到一行输入
s: 存放输入字符串的容器 char buf[20];
size: 容器的大小 单位字节
stream: stdin
scanf: 格式化输入
int scanf(const char *format, ...);
int sscanf(const char *str, const char *format, ...);
sscanf 从str内存中 按格式提取
格式控制字符串: 非常类似于printf
%d 表示 输入提取为一个整型数
%f 表示 输入提取为一个小数数
%4d 表示 输入提取为一个整型数 宽度为4个数字
%4c 表示 输入提取4个字符 组成字符串
%s 输入一个字符串 默认以空格 或 回车 或 制表符(tabl)
返回值 表示成功的提取项的个数
练习:
输入两个数 输出其和
高级用法:
输入身份证号码 510502202205050016 取出 生日
printf("请输入你的身份证号码:");
scanf("%*6d%4d%2d%2d%*5c",&y,&m,&d);
scanf 处理输入字符串时 会存在 输入残留 通常会导致 残留到下一次输入内容
处理残留:
%*c 将后续所有字符都 取出丢弃
%*6d 取出6个数字 丢弃
%*2c 取出2个字符 丢弃