目录
变量:
存储类型:
auto 自动存储类型
register 寄存器存储类型
static 静态存储类型
extern 外部引用
数据类型:
c语言数据类型分类:
变量:
程序中可以被改变的数据量
计算机在内存中开辟一片空间给程序员存放数据,空间内的数据可以被改变
程序员在代码中向系统申请空间(定义变量)
[存储类型] [数据类型] [变量名];
存储类型:规定了变量存放的区域
数据类型:规定的变量存放空间的大小
变量名:对存储数据的空间取名字,要符合标识符命名规则
存储类型:
局部变量:
程序中可以被改变的数据量
计算机在内存中开辟一片空间给程序员存放数据,空间内的数据可以被改变
程序员在代码中向系统申请空间(定义变量)
[存储类型] [数据类型] [变量名];
存储类型:规定了变量存放的区域
数据类型:规定的变量存放空间的大小
变量名:对存储数据的空间取名字,要符合标识符命名规则
在模块内部定义的变量
从定义位置开始到模块结束(}),都一直存在,生命周期短
从定义位置开始到模块结束(}),都一直被使用,作用域窄
定义时未被初始化,默认值为随机值
全局变量:在所有模块外部定义的变量
从定义位置开始到程序结束,都一直存在,生命周期长
从定义位置开始到程序结束,都一直能被使用,作用域广
定义时未被初始化,默认值为0
auto 自动存储类型
int n;//默认就是自动存储类型,通常省略
auto int m;
去定义全局变量时,将变量存放在全局变量区,不初始化全局变量,值默认为0
去定义局部变量时,将变量存放在栈区,不初始化局部变量,值是随机值
register 寄存器存储类型
将变量放到寄存器中,不在内存中
寄存器数量少,运行速度快,可能申请失败
static 静态存储类型
修饰全局变量时,会限制变量只能在本文件内使用,限制变量的作用域
修饰局部变量时,会将变量存放到全局变量区,延长变量的生命周期
修饰函数,和全局变量一样
extern 外部引用
引用外部定义
文件的外部
起修饰作用:const,volatile
int n;//默认就是自动存储类型,通常省略
auto int m;
去定义全局变量时,将变量存放在全局变量区,不初始化全局变量,值默认为0
去定义局部变量时,将变量存放在栈区,不初始化局部变量,值是随机值
将变量放到寄存器中,不在内存中
寄存器数量少,运行速度快,可能申请失败
static 静态存储类型
修饰全局变量时,会限制变量只能在本文件内使用,限制变量的作用域
修饰局部变量时,会将变量存放到全局变量区,延长变量的生命周期
修饰函数,和全局变量一样
extern 外部引用
引用外部定义
文件的外部
起修饰作用:const,volatile
修饰全局变量时,会限制变量只能在本文件内使用,限制变量的作用域
修饰局部变量时,会将变量存放到全局变量区,延长变量的生命周期
修饰函数,和全局变量一样
起修饰作用:const,volatile引用外部定义
文件的外部
const:将变量常量化
修饰局部变量,变量的值只读,不能被修改
修饰指针,根据const的位置不同,功能也不同
修饰函数的参数,说明参数在函数内部不能被修改
volatile:防止编译器优化让程序从内存去读取变量的值
确保数据是准确的,没有被意外改变
数据类型:
c语言数据类型分类:
基本数据类型:单个数据
整型:char short int long
浮点型:float double
字符型:char
枚举型:enum,会自动赋值,默认从0开始,后面依次是前一个加一的结果
结构数据类型:集合
数组:一次性定义多个相同类型变量,在空间内连续存放
结构体:存放不同类型变量的集合,每一个变量有自己独立的空间
共用体:存放不同类型变量的集合,所有变量共用一片空间
特殊数据类型:
指针:存放地址的变量
void:用于修饰指针,表示不确定类型的地址;用于修饰函数,表示无返回值或无参数
char 在64位操作系统中,占1个字节
unsigned char:0 ~ 255
signed char:-128 ~ 127
char(默认有符号)
short 在64位操作系统中,占2个字节
unsigned short:0 ~ 65532(2^16-1)
signed short:-2^15 ~ 2^15-1
short(默认有符号)
int 在64位操作系统中,占4个字节
unsigned int:0 ~ 2^32-1
signed int: -2^31 ~ 2^31-1
int(默认有符号)
long 在64位操作系统中,占8个字节,在32位操作系统中,占4个字节
unsgned long:0 ~ 2^64-1(64位操作系统)
signed long:-2^63 ~ 2^63-1(64位操作系统)
long(默认有符号)
float 在64位操作系统中,占4个字节,都是有符号数
共32位,1位存放符号位,8位存放指数位(以127为基数),23位为尾数位
double 在64位操作系统中,占8个字节,都是有符号数
数据在内存中的存储:共64位,1位存放符号位,11位存放指数位(以127为基数),52位为尾数位
数据是以补码的形式存放在内存中,主要看数据的值 / 数据本身
取出数据使用时看数据类型或输出格式
正整数和0:对于无符号数都是正整数
源码 == 补码
int n = 12;
源码: 0000 0000 0000 0000 0000 0000 0000 1100
补码: 0000 0000 0000 0000 0000 0000 0000 1100
负整数:源码就是直接转为二进制
反码:源码取反,不改变符号位
补码:反码加一
int n = -12;
源码: 1000 0000 0000 0000 0000 0000 0000 1100
反码: 1111 1111 1111 1111 1111 1111 1111 0011
补码: 1111 1111 1111 1111 1111 1111 1111 0100
补码取反:1000 0000 0000 0000 0000 0000 0000 1011
加一: 1000 0000 0000 0000 0000 0000 0000 1100
源码-> 补码:取反加一
补码-> 源码:取反加一 或 减一取反
大小端大端存储:数据的高八位(左边),存放在内存低地址(数字小的)中
小端存储:数据的高八位(左边),存放在内存高地址(数字大的)中
类型转换:显示转换:看得见的数据转换
强制类型转换:(数据类型)
int n = 0;
float pi = 3.14;
n = (int)pi;
隐式转换:看不见的类型转换
不同数据类型在进行运算时,会进行隐式转换,将不同类型转换为同一类型
将低精度转换为高精度,有符号转换为无符号
int n = 0;
float pi = 3.14;
n = pi;
n 的结果为3,编译不报错



