进制:(进位的制度)
逢几进1 (满几进1)
十进制:
0 1 2 3 4 5 6 7 8 9
10 11 12 13 ... 19
20 ...
八进制:
0 1 2 3 4 5 6 7
10 11 12 13 ... 17
20 ...
十六进制: // 10 11 12 13 14 15
0 1 2 3 4 5 6 7 8 9 a b c d e f
10 11 12 13 ... 1f
20 ...
二进制:
0 1
10 11
十进制 ===> 二进制
方法: 除2取余法(辗转相除法)
2|123
2|61 ... 1 (低位)
2|30 ... 1
2|15 ... 0
2|7 ... 1
2|3 ... 1
2|1 ... 1
2|0 ... 1 (高位)
111 1011
二进制 ===> 十进制
方法:
加权求和
64 32 16 8 4 2 1
2^1 2^0
1 1 1 1 0 1 1 =64 + 32 + 16 + 8 + 2 + 1
二进制 => 八进制
0 1 2 3 4 5 6 7
0 1 10 11 100 101 110 111
对应关系:
1位八进制数 对应 3位 二进制数
001 111 011
1 7 3
二进制 => 十六进制
对应关系:
1位十六进制进制数 对应 4位 二进制数
0111 1011
7 b
数据类型
常量 vs 变量
常量 "在程序运行过程中", 不能改变的量
变量 "在程序运行过程中", 能被改变的量
整型
常量形式:
123 //十进制的整型常量
0x123 //十六进制的整型常量
0123 //八进制的整型常量
整型变量:
定义变量
数据类型 变量名;例 int a
unsigned / signed int
unsigned / signed short
unsigned / signed long
unsigned / signed long long
变量名:
是一个名字 --- 标识符
怎么起名字?
1.数字、字母、下划线组成
2.开头不能是数字
3.不能与关键字重名
4.不要和预处理命令 及 库函数名重名
数据类型的大小
表示的是该数据类型 所占内存空间的字节数
int 4字节
short 2字节
long 8字节
long long 8字节
sizeof(运算数)
计算运算数所代表的数据类型占用的内存空间的字节数
运算数 可以是一个类型名
sizeof(int)
可以是变两名
sizeof(a)
可以是个常量或表达式
sizeof(10)
sizeof(a+10)
变量给值
int a = 10; //定义的同时给值 初始化
int a;
a = 10; //赋值
变量之所以能变 --- 变量实际上对应是一块可以被修改的空间
大小端
小端 高高低低
高位数据 存在 高地址(地址编号大) 处
低位数据 存在 低地址 处
0x12345678
大端 (与小端相反)
x86 体系结构 --- 小端模式
51 单片机---大端模式
整型数据的存储
小端存储
int a = 123; //00 00 00 7B
0000 0000 0000 0000 0000 0000 0111 1011 //二进制
补码:
计算机最终存储的都是 他们的补码形式
正数
原码 反码 补码 都是一样的
负数 原码:本来的码
反码:原码的符号位不变 其余位按位取反
补码:反码 + 1
123
0111 1011 //原码
0111 1011 //反码
0111 1011 //补码
无符号 --- 表示所有的二进制位 都是数值位
有符号 --- 表示 有一位(最高位)充当了符号位(1为负,0为正),其余位是数值位
-7
1|000 0000 0000 0000 0000 0000 0000 0111 //原码
1|111 1111 1111 1111 1111 1111 1111 1000 //反码
1|111 1111 1111 1111 1111 1111 1111 1001 //补码
十六进制: f f f f f f f 9
unsigned char a = 65535;
a [ 1111 1111 1111 1111 ]
|
%hd //d 表示以有符号十进制形式来打印 h表示half,为打印int类型的一半也就是两个字节
|
V
1|111 1111 1111 1111
|
V
最高位是1 表示 这个值 一定是 某个负数 的补码值
最终打印的一定是原码值
1|111 1111 1111 1111
1|000 0000 0000 0001 // -1
整型类型取值范围
int 4字节
unsigned int 0~2^32-1
signed int -2^31 ~ 2^31- 1
short 2字节
unsigned short 0~2^16-1 //65535
signed short -32768 ~ 32767
long 8字节
long long 8字节
浮点型:
浮点型 常量形式
1.23
1.23e-4 //科学计数法形式 1.23 * 10^-4
1.23E-4 //大写也行
浮点型 变量
关键字
float 单精度
double 双精度 --- 精度
long double
定义变量
float f;
浮点型 大小
float 4字节
double 8字节
long double 16字节
浮点数的存储
12.125 //存到计算机
step1: 首先 将十进制形式的小数,写成 二进制形式的小数
整数
除2取余法
小数部分
乘2取整法
12 --- 1100
0.125 * 2 = 0.25 --- 0
0.25 * 2 = 0.5 --- 0
0.5 * 2 = 1 --- 1
0.001
二进制形式
1100.001
step2: 将二进制形式的小数 写成 科学计数法形式
1100.001 => 1.100001 * 2^3(类比十进制)
step3: 按照 IEEE 754 标准 存放
1位 | 8位 | 23位
符号位 | 指数位 | 尾数位
0 | 3 (3次方)+ 127(偏移量) | 100001 //偏移量是为了应对指数为负数的情况,-127对应0000 0000
0100 0001 0100 0010 0000 0000 0000 0000 // 12.125 存到计算机中的样子
4 1 4 2 0 0 0 0
注意
浮点的比较
代码中出现的 浮点型常量 默认识别为 double 类型
代码中出现的变量或常量一定有其对应的数据类型
有什么用呢?
如
float a=0.9;if(a==0.9)是不成立的
因为
float
1位 符号位|8位 指数位 |23位 尾数位
+127
double
1位 符号位|11位 指数位 |52位 尾数位
+1023
double 精度更高,后面的数更多
浮点数的比较:
保证精度一致,即类型一致
常量也可以指定类型:
0.9f //表示被识别为 float类型
123 //默认识别为 int类型
123L //识别为long类型
123LU //unsigned long
123LL //long long
123LLU //unsigned long long
字符型:
符号 --- 放到计算机中 实际保存的都为0或1的编码序列
'a' --编码---0110 0001----97
ASCII
'a' --计算机中保存实际上是这个符号 对应 ascii的编码值
0~32 控制字符(不可见字符)
48~57 数字字符 '0' ~ '9'
65~90 英文的26个大写 字母的符号
97~122 英文的26个小写 字母的符号
字符型常量
'a' //字符常量 a这个常量
字符型变量
char
char ch; //一个字节
char ch = 'a';
ch这个变量中 最终放的放的实际上是 'a' 对应的ascii码值 (整型)
char //可以看为tiny int --小整型只有一个字节大小
char 也一种整型类型 说char和整型之间是通用的
unsigned char ch; //[0 ~ 255]
signed char a = 10; //[-128 ~ 127]
字符型 大小
一个字节
补充
char ch = '1';
printf("%d\n",ch - 48); //数值1
printf("%d\n",ch - '0'); //数值1
大写 转 小写 +32
转义字符:
转义
'n' //字符 n
'\n' //转换含义 --- 表示换行
'\t' //调到下一个制表符 --- 制表符的宽度 8个字符
'\b' //退格
'\r' //回车 --效果是光标回到本行开头
字符常量:
'A'
'\101' //转义 八进制
'\x41' //转义 十六进制
-----------------------
char ch = 0101;
char ch = 0x41;