一 C语言中,关于对数的设计类型:
数据类型: 即 对 不同类型的数 的 表示 和 存储
整数类型 精确类型
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
定义使用数据类型时要确定是否会产生溢出 列如 -128到+127这个范围内,若此时+127的二进制码再加一
则与-128的二进制码相同 :127=0b111 1111 -128=1000 0000
unsighed char 无符号字符型
有符号与无符号的区别
负数如何表示 -2 -10 -1
有符号数 最高bit 作为符号位 0 正数 1 负数
signed char -128 ~ 0 ~ +127
补码形式 存储有符号类型
LinuxC中:
不写 signed 默认 都是有符号 gcc
单片机C中 arm gcc
char 不写 默认无符号类型
除char类型 外 其他不写signed 默认是有符号类型
有符号
最高位 为 符号位 其余位 存储值 若值是负数 补码
负数值 = 补码取反 +1
强类型语言:
C语言: 任何变量或存储空间 必要先定义(给定类型 ) 然后才能使用
且 使用过程中 类型不不能更改
弱类型语言python
定义的初始变量不等于结束变量
小数: 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
变量: 程序运行过程中 可能改变的量
其本质 即 给一个 内存空间 命名 通过该名字访问内存
C语言中 的 变量
1. 先定义再使用 2. 定义时给定类型 一旦定义完成 其类型将不能改变
示例 变量的定义:
存储类型 数据类型 变量名;
auto int a; // 即表示 声明一段4字节内存空间 命名为 a
若省略存储类型 即 auto 类型 auto类型可以不写,不写的可以默认为auto型
存储类型: 决定了 变量存储的位置
存储相关的关键字 auto const extern register static
二 C语言内存结构:
常量
1.代码段: 存储代码 即编译的二进制指令 只读 (属性)
2.常量区: 存储程序中的 常量 "" (""双引号扩起来的部分) 常量字符串 只读
可以使用 const 关键字 修饰全局变量 将该变量的存储位置 变更为常量区
关键字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; 可以 printf可以定义但是不一定可以使用,和输出重名
库标识符: 库中 有对于该标识的定义
系统标识符: 由编译定义了的 include
数据类型的转换: 将类型不匹配 的数据 转换为 对应匹配类型的数据格式
隐式类型转换: 有编译器 自动完成 一些默认转换模式
强制类型转换: 编程者 手动进行的 强制性的类型 转换
变量 或 值 前 使用(目标类型)
类型的转换过程:
float ---> int 舍弃小数 取整操作
int ---> float 整型(精确类型) 小数(非精确类型) 精度会丢失 int的精度会更高一点
int ---> char 溢出部分舍弃 宽存储空间 转换为 小存储空间
int ---> short
小存储空间 转换为 宽存储空间 不影响
整型与浮点型 参与运算时 隐式类型转换 会统一转换为浮点型计算 列如:int a=2; float b=3.00 a+b=5.00000
有符号数 无符号数 强制类型转换时 存储内容 完全没有改变 但影响计算
C语言中标准输入与输出:
标准输入: 程序终端 输入的内容
标准输出: 程序输出 到终端显示
输出: 使用man 函数名 查询该函数
putc(); 输出一个字符 'a'
putchar(); 与putc一样 输出一个字符
puts(); 输出一个字符串 "hello world"
sprintf/snprintf 即格式化后 输出到 指定内存容器str中
返回值: 成功 返回 格式化后输出的字符个数
... 变长参数个数
getchar()用于吸收产生的空格键
使用: 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 类型的浮点数
练习: 代码名字整数和小数
若有定义 float f = 2.5690;
请输出 f=整数部分,.f=小数部分 保留2位小数
示例: f=2,.f=0.57
标准输入:
#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个字符 组成字符串