由于计算机内只有高低电平,只能代表0和1两种状态,就此产生了二进制,而人们习惯的数字是十进制。所以就存在十进制与二进制之间的转换,但是由于二进制表示数据起来不方面(特别是当数值比较大时),十进制转换为二进制又比较麻烦,就产生了八进制、十六进制
进制对照表

2进制与八进制、十六进制转换十分容易
每个进制都是的每一位都是有位权的< http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+yOejujEwMDGjqLb+vfjWxqOpICAgICAgMl4zKjEgJiM0MzsgMl4yKjAgJiM0MzsgMl4xKjAgJiM0MzsgMl4wKjEgPSA5PC9wPgo8cD4gICAgMTAwMaOosMu9+NbGo6kgICAgICA4XjMqMSAmIzQzOyA4XjIqMCAmIzQzOyA4XjEqMCAmIzQzOyA4XjAqMSA9IDUxMzwvcD4KPHA+ICAgIDEwMDGjqMquvfjWxqOpICAgICAgMTBeMyoxICYjNDM7IDEwXjIqMCAmIzQzOyAxMF4xKjAgJiM0MzsgMTBeMCoxID0gMTAwMTwvcD4KPHA+ICAgIDEwMDGjqMquwfm9+NbGo6kgICAgMTZeMyoxICYjNDM7IDE2XjIqMCAmIzQzOyAxNl4xKjAgJiM0MzsgMTZeMCoxID0gNDA5NzwvcD4KPHA+0tTJz7XEtrzKx7u7y+O1vcquvfjWxrXEvMbL473hufuho7/JvPvNrNK7uPbK/dfWyOe5+86qsrvNrMr91sa087bgyv3H6b/2z8Kx7cq+tcTK/SYjMjA1NDA7tPPQocrHsrvNrLXEPC9wPgo8cD48cHJlIGNsYXNzPQ=="brush:java;">#include
运行结果:
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次方
比如:
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快许多了
二进制转十进制比较简单,如前面所说的按位权乘加就可以了。十进制转八进制、十六进制和上面的一样,只是省去了转换为二进制的步骤