由于计算机内只有高低电平,只能代表0和1两种状态,就此产生了二进制,而人们习惯的数字是十进制。所以就存在十进制与二进制之间的转换,但是由于二进制表示数据起来不方面(特别是当数值比较大时),十进制转换为二进制又比较麻烦,就产生了八进制、十六进制
进制对照表
二进制、八进制、十六进制转换为十进制是比较容易的
每个进制都是的每一位都是有位权的
如:1001(二进制) 2^3*1 + 2^2*0 + 2^1*0 + 2^0*1 = 9
1001(八进制) 8^3*1 + 8^2*0 + 8^1*0 + 8^0*1 = 513
1001(十进制) 10^3*1 + 10^2*0 + 10^1*0 + 10^0*1 = 1001
1001(十六进制) 16^3*1 + 16^2*0 + 16^1*0 + 16^0*1 = 4097
以上的都是换算到十进制的计算结果。可见同一个数字如果为不同数制大多数情况下表示的数值大小是不同的
#include<stdio.h> #define Binary 0b100 #define Octal 0100 #define Decimal 100 #define Hex 0x100 int main() { printf("the Binary %d\n", Binary); printf("the Octal %d\n", Octal); printf("the Decimal %d\n", Decimal); printf("the Hex %d\n", Hex); return 0; }
运行结果:
the Binary 4
the Octal 64
the Decimal 100
the Hex 256
C语言中默认数值是十进制,如果一个数值是0开头的就是八进制,如果以0x或者0X开头就是十六进制
同样可以通过printf指定不同的格式打印相应的进制
%d %u有无符号十进制打印
%o 八进制打印
%x %X 十六进制打印,两者区别x约定使用abcedf,而X预定使用ABCDEF
二进制与八进制/十六进制转换比较简单,因为分别是2的3次方,4次方。可以用3位二进制表示一位八进制,用4位二进制表示1位十六进制
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
000 |
001 |
010 |
011 |
100 |
101 |
110 |
111 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
a |
b |
c |
d |
e |
f |
0000 |
0001 |
0010 |
0011 |
0100 |
0101 |
0110 |
0111 |
1000 |
1001 |
1010 |
1011 |
1100 |
1101 |
1110 |
1111 |
比如:
1100(二进制) -----> 001100 ----> 14(八进制)
1100(二进制) -----> 1100 ----> c (十六进制)
反之也是一样
十进制与二进制转换
十进制 ------> 二进制
这里可以用十六进制过度。16 ,256 ,4096 ,65536 ,1048576 ,16777216 ...(分别是就是16^1 ,16^2 ,16^3……)
先找第一个比要转的那个数小的数,然后用这个数除那个要转的数,得到的商就是那个位的数(位数就是是指数),然后找到第一个比余数小的数,)
如:
9999 ----> 二进制?
9999/4096 商为2,说明十六进制的第3位为2,余数为1807。
1807/256 商为7,说明十六进制的第2位为5,余数为15。
后面的直接是十六进制第一位为0,第零位为15
9999(十进制) ----> 270f(十六进制) -----> 0010 0111 0000 1111(二进制)
这样就比9999这么大的数一直除2快许多了
十进制转八进制、十六进制和上面的一样,只是省去了转换为二进制的步骤
有符号类型,以char类型为例
负数用二进制补码表示,二进制最高位为符号位或负权
二进制 0000 0000 ~ 1111 1111
正数 0000 0000 ~ 0111 1111 0 ~ 127
负数 1000 0000 ~ 1111 1111 -128 ~ -1
原码、反码、补码
100 ---> 0110 0100
正数的原码与补码相同
-100
原码 1110 0100
反码 1001 1011
补码 1001 1100 (计算机实际存储的值)
如何得出负数二进制和十进制的对应关系?
1、除符号位外,各位取反加1
1111 1111
x000 0000
x000 0001 ----> -1
2、把符号位看作负权-2^7
1111 1111
= -2^7 + 2^6 ... + 2^0
= -1
如何表示负数时认为规定的
用1111 1111 表示-1 还是 -127并没有什么原则问题
负数使用补码的好处
2 0000 0010
-2 1111 1110
二进制相加为零,可简化硬件实现
另外再说一下计算机中的速度与空间
1字节(Byte) = 8bit
宽带运营商标识网速的单位是Kbps或者Mbps(bit per second)这里是bit而不是Byte
所以1Mbps的下载速度下载100M大小的文件,需要800s而不是100s
bps->Kbps->Mbps->Gbps->Tbps
1Kbps=1000bps(其他依此类推)
Byte->KB->MB->GB->TB
1KB=1024B(其他依此类推)
我们通常更关注的实际真是的速度
实际速度会有三方面的因素影响:1、源文件的读取速度;2、传输速度;3、目的写入速度
100M的网络带宽是瓶颈,1000M的网络存储介质就是瓶颈了