一、进制介绍
计算机中的进制: 二进制 八进制 十进制 十六进制
十进制 : 由 0-9 的字符组成的.
例子: 100000000
二进制 : 由 0和1两种字符组成的.
例子 : 0b10
八进制 : 由 0 - 7 八种字符组成的.
例子 : 0755
十六进制 : 由 0-9 和 a-f十六种字符组成的.
例子 : 0xff
二、进制转换
1、[二进制 转 十进制]
0b10010 == 18
=1x2^1 + 1x2^4
= 2 + 16
= 18
[转换方法] 二进制数 右边为低位数据,左边为高位数据. 从右往左看 依次是第0,1,...位. 每一位数据乘以对应自己的2的位数次方.然后相加得到十进制结果.
2、[十进制 转 二进制]
18 == 0b10010
[转换方法] 除2法
[注] 我们之所以要学习二进制和十进制之间的相互转换,是因为二进制是计算机中数据的表达方式. 但是 十进制却是我们人类表示数据的常用方式.为了能和计算机交互,为了能更清楚的了解计算机的工作原理,我们必须搞清楚二进制和十进制之间的相互转换.
[注] 二进制 书写起来对于程序员来说不容易看懂. 十进制转 二进制过程比较繁琐. 所以引入 八进制和 十六进制.
3、[二进制转 八进制/十六进制]
0b10010 == 022
= 010 010
= 2 2
=022
0b10010 == 0x12
=0001 0010
=1 2
=0x12
0b11100 == 0x1c
= 0001 1100
= 1 c
= 0x1c
[转换方法] 二进制 转八进制 , 采用[三位一取],从右往左,每三位作为一组,最高位不够补0 ,每一组转换为对应的十进制数对应的八进制字符.
二进制 转十六进制 , 采用 [四位一取],从右往左,每四位作为一组,最高位不够补0,每一组转换为对应十进制数对应的十六进制字符.
4、[八进制/十六进制转 二进制]
022 == 0b10010
=010 010
=0b10010
[八进制转 二进制 ] [一位变三位] ,八进制数的每一位转换为对应二进制数的三位.
0x22 ==
=0010 0010
=0b100010
0x12
= 0001 0010
=0b10010
[十六进制转 二进制 ] [一位变四位],十六进制数的每一位转换为对应二进制数的四位.
[注] 二进制,八进制,十进制,十六进制,这四种进制只是对于同一个整数的不同表现形式.
[注] 八进制/十六进制和 十进制之间的相互转换,需要借助二进制来实现.
//二进制数在代码中是以0b开头的.
//没有二进制数对应的数据输出格式
printf("%d\n",0b10);// %d是十进制的数据输出格式
printf("%d\n",0b10010);
//八进制在代码中是以0开头的.
//数据输出格式为: %o
printf("%o\n",022);
printf("%d\n",022);
//十六进制在代码中是以0x开头的.
//数据输出格式为: %x
printf("%x\n",0x12);
printf("%d\n",0x12);
三、进制应用
1、[十六进制的应用] -- 颜色表示
0000 0000 == 0
1111 1111 == 255
#FFFFFF == 白色
#000000 == 黑色
#FF0000 == 红色
#AAAAAA == 浅灰色
#222222 == 深灰色
2、[八进制的应用] --文件权限
在类似Unix 系统下(mac)所有的东西都当做文件看,每个文件都有固定的权限
这个权限决定了拥有这个文件的用户所能进行的操作.
读 r (read)
写 w(write)
执行 x (excute)
一个文件的权限分 三组,每一组都可能有读,写,执行权限.
rwx r-x r-x
111 101 101
7 5 5
0755
第一组: 文件所有者的权限
第二组: 所有者所在小组其他成员的权限
第三组: 其他组成员的权限
[注]使用chmod 命令可以更改文件的权限
ytf:~ mac$ chmod 0755 ceshi
四、二进制形态
计算机是以二进制的形式来数据存储,数据运算的.二进制有三种形态 :原码 反码 补码
1、
计算机中 8个二进制位组成一个字节
1024字节 == 1KB
1024KB == 1MB
1024MB == 1GB
1024GB == 1TB
2、[原码]
[程序中任何一个数据都必须存储在固定大小的内存单元中]
[计算机所能分配的最小的内存单元为1个字节]
[注] 对于一个数据,如果用二进制的原码形式表示.最高位为符号位,其余位表示这个数据的绝对值大小.
正数的符号位为 0
负数的符号位为 1
0000 0011 1个字节 3的原码
1000 0011 1个字节的 -3的原码
0000 0011 3
1000 0011 -3 +
----------------------------
1000 0110 -6
[结论] 计算机不以二进制 的原码来进行数据存储,数据运算.
[原因] 原码 无法正确运算
3、[反码]
正数的反码和原码一样.负数的反码是原码的符号位不变,其他位取反(1变0,0变1)
0000 0011 1字节的3的反码
1111 1100 1字节的 -3的反码
0000 0011 3
1111 1100 -3 +
----------------------------
1111 1111
[结论] 计算机不以二进制 的反码来进行数据存储,数据运算.
[原因] 反码 无法正确运算
4、[补码]
[注] 正数的补码和原码,反码一样
负数的补码是反码加1
0000 0011 1字节的3的补码
1111 1101 1字节的-3的补码
0000 0011 3的补码
1111 1101 -3的补码 +
---------------------------------
0000 0000 0的补码
[结论] 计算机是以二进制 的补码来进行数据存储,数据运算.
[原因] 补码 可以正确运算