由于计算机内只有高低电平,只能代表0和1两种状态,就此产生了二进制,而人们习惯的数字是十进制。所以就存在十进制与二进制之间的转换,但是由于二进制表示数据起来不方面(特别是当数值比较大时),十进制转换为二进制又比较麻烦,就产生了八进制、十六进制
进制对照表
2进制与八进制、十六进制转换十分容易
每个进制都是的每一位都是有位权的
如: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次方
比如:
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快许多了
二进制转十进制比较简单,如前面所说的按位权乘加就可以了。十进制转八进制、十六进制和上面的一样,只是省去了转换为二进制的步骤
数制的转换(二进制、八进制、十进制、十六进制),布布扣,bubuko.com
原文:http://blog.csdn.net/wangpeihuixyz/article/details/21984367