目录

二进制
进制分类
进制表示形式
进制转换
原码 反码 补码
数据类型
数据类型转化


5 二进制

5.1 进制分类

1
2
3
1.二进制
2.十进制
3.十六进制

5.2 不同进制表示形式

1
2
3
十进制: 就是十进制(无特殊)
二进制: 0b010101
十六进制: 0x 0X #0x #0X

5.3 进制之间的转换

1
2
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
33
34
35
36
37
38
39
40
41
42
43
44
45
二进制转十进制
方式: 从低位开始,提取每一位的数据,乘以2的(位数-1)次方, 结果相加
0111 二进制
0 1 1 1
1*2^(1-1)=1
1*2^(2-1)=2
1*2^(3-1)=4
0*2^(3-1)=0
1+2+4+0=7

十进制转二进制
方式: 使用该数不断的除以2,直到商为零结束, 最后把每一步计算的余数倒叙组合就是二进制
10十进制 转为二进制
10%2=50
5%2=21
2%2=10
1%2=01
1010

十六进制转为十进制
方式: 从低位开始,提取每一位的数据,乘以16的(位数-1)次方, 结果相加
#0x12A
(A)10*16^0=10
(2)2* 16^1=32
(1)1*16^2=256
256+32+10=298
十进制转为十六进制
方式: 使用该数不断的除以16,直到商为零结束, 最后把每一步计算的余数倒叙组合就是二进制
33(十进制)
33%16=21
2%16=02
十六进制的结果: 21

二进制转为十六进制
方式: 把二进制每4位一组,计算十六进制
1001 1100
9(十进制) 12(十进制)
十六进制结果: 9C

十六进制转为二进制
方式: 把每一位转成4位一组的二进制
9C
(C)12=8+4 二进制表示: 1010
(9) 9=8+1 二进制表示: 1001
二进制结果: 10011010

5.4 原码 反码 补码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
机器数: 就是二进制数据
形式值:没有符号位 1111 最高位不是符号位
真值: 有符号位 1111( 最高位是符号位)

原码: 真值
反码:
正数的反码就是原码
负数的反码符号位不变其余取反 1111---> 1000
补码:
正数的补码就是原码
负数的补码就是反码+1,符号位不变

总结:1.正数的 原码 反码 补码 一致
2.计算中存储的数据都是以补码形式存在

5.5 数据类型

整型 浮点型 布尔类型
char 1字节 float 4字节 宏定义(自定义布尔类): #define BOOL int
short 2字节 double 8字节 使用c99标准中:Bool
int 4字节 long double 16字节 使用c99标准: 导入头文件

<stdbool.h>
long (32:4字节 64:8字节) —> 现在的笔记本是使用了32位系统的转化方式(4字节)
long long 8字节

5.6 数据类型转化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
自动类型转换:  窄类型转为宽类型
1.运算过程中的自动类型转换(隐式转换)
比如: int a=1;short b=2
计算: a+b 结果是int类型

2.赋值过程中的自动类型转换(隐式转换)
比如: float f=3.14; 自动把double类型转为了float类型

3.强制类型转化
宽类型转为窄类型
案例:
//计算三个人的平均年龄
int age1=20,age2=23,age3=24;

//printf("%lf",(age1+age2+age3)/3.0); // 22.333333
printf("%lf",(double)((age1+age2+age3)/3)); // 22.000000
printf("%lf",(double)(age1+age2+age3)/3); // 22.333333