、八、十六进制数转换到十进制数 1 .1 二进制数转换为十进制数 二进制数第0位的权值是2的0次方,第1位的权值是2的1次方……
所以,设有一个二进制数:0110 0100,转换为10进制为:
下面是竖式:
 
0110 0100 换算成 十进制
 
第0位 0 * 2 0   =  0
第1位 0 * 2 1   =  0
第2位 1 * 2 2   =  4
第3位 0 * 2 3   =  0
第4位 0 * 2 4   =  0
第5位 1 * 2 5   = 32
第6位 1 * 2 6   = 64
第7位 0 * 2 7   =  0    
---------------------------
              100    
 
用横式计算为:
0 * 2 0   0 * 2 1   1 * 2 2   1 * 2 3   0 * 2 4   1 * 2 5   1 * 2 6   0 * 2 7  = 100
 
0乘以多少都是0,所以我们也可以直接跳过值为0的位:
1 * 2 2   1 * 2 3     1 * 2 5   1 * 2 6  = 100
 
1 .2 八进制数转换为十进制数 八进制就是逢8进1。
八进制数采用 0~7这八数来表达一个数。
八进制数第0位的权值为8的0次方,第1位权值为8的1次方,第2位权值为8的2次方……
所以,设有一个八进制数:1507,转换为十进制为:
用竖式表示:
 
1507换算成十进制。
 
第0位 7 * 8 0  = 7
第1位 0 * 8 1  = 0  
第2位 5 * 8 2  = 320  
第3位 1 * 8 3  = 512  
--------------------------
              839
同样,我们也可以用横式直接计算:
7 * 8 0   0 * 8 1   5 * 8 2   1 * 8 3 =  839
 
结果是,八进制数 1507 转换成十进制数为 839
1.3 十六进制数转换成十进制数 2进制,用两个阿拉伯数字:0、1;
8进制,用八个阿拉伯数字:0、1、2、3、4、5、6、7;
10进制,用十个阿拉伯数字:0到9;
16进制,用十六个阿拉伯数字……等等,阿拉伯人或说是印度人,只发明了10个数字啊?
 
16进制就是逢16进1,但我们只有0~9这十个数字,所以我们 用A,B,C,D,E,F这五个字母来分别表示10,11,12,13,14,15 。字母不区分大小写。
十六进制数的第0位的权值为16的0次方,第1位的权值为16的1次方,第2位的权值为16的2次方……
所以,在第N(N从0开始)位上,如果是是数 X (X 大于等于0,并且X小于等于 15,即:F)表示的大小为 X * 16的N次方。
假设有一个十六进数 2AF5, 那么如何换算成10进制呢?
 
用竖式计算:
 
2AF5换算成10进制:
 
第0位:  5 * 16 0  = 5
第1位:  F * 16 1  = 240
第2位:  A * 16 2  = 2560
第3位:  2 * 16 3  = 8192  
-------------------------------------
                 10997  
直接计算就是:
5 * 16 0   F * 16 1   A * 16 2      2 * 16 3  = 10997
(别忘了,在上面的计算中,A表示10,而F表示15)
 
现在可以看出,所有进制换算成10进制,关键在于各自的权值不同。
假设有人问你,十进数 1234 为什么是 一千二百三十四?你尽可以给他这么一个算式:
1234 = 1 * 10 3   2 * 10 2   3 * 10 1   4 * 10 0
十进制数转换到二、八、十六进制数
2 .1 10进制数转换为2进制数
 
给你一个十进制,比如:6,如果将它转换成二进制数呢?
 
10进制数转换成二进制数,这是一个连续除2的过程:
把要转换的数,除以2,得到商和余数,
将商继续除以2,直到商为0。最后将所有余数倒序排列,得到数就是转换结果。
 
听起来有些糊涂?我们结合例子来说明。比如要转换6为二进制数。
 
把要转换的数,除以2,得到商和余数”。
那么:
要转换的数是6, 6 ÷ 2,得到 商是3,余数是0 。 (不要告诉我你不会计算6÷3!)
  
将商继续除以2,直到商为0……”
现在商是3,还不是0,所以继续除以2。
那就: 3 ÷ 2, 得到 商是1,余数是1
 
将商继续除以2,直到商为0……”
现在商是1,还不是0,所以继续除以2。
那就: 1 ÷ 2, 得到 商是0,余数是1  (拿笔纸算一下,1÷2是不是商0余1!)
 
将商继续除以2,直到商为0……最后将所有余数倒序排列”
好极!现在商已经是0。
我们三次计算依次得到余数分别是:0、1、1,将所有余数倒序排列,那就是:110了!
 
6转换成二进制,结果是110。
 
把上面的一段改成用表格来表示,则为:
被除数
计算过程
余数
6
6/2
3
0
3
3/2
1
1
1
1/2
0
1
(在计算机中,÷用 / 来表示)
说了半天,我们的转换结果对吗?二进制数110是6吗?你已经学会如何将二进制数转换成10进制数了,所以请现在就计算一下110换成10进制是否就是6。
2 .2 10进制数转换为8、16进制数
 
非常开心,10进制数转换成8进制的方法,和转换为2进制的方法类似,惟一变化:除数由2变成8。
 
来看一个例子,如何将十进制数120转换成八进制数。
 
用表格表示:
被除数
计算过程
余数
120
120/8
15
0
15
15/8
1
7
1
1/8
0
1
 
120转换为8进制,结果为:170。
 
非常非常开心,10进制数转换成16进制的方法,和转换为2进制的方法类似,惟一变化:除数由2变成16。
 
同样是120,转换成16进制则为:
被除数
计算过程
余数
120
120/16
7
8
7
7/16
0
7
 
120转换为16进制,结果为:78。
 
请拿笔纸,采用(图:1)的形式,演算上面两个表的过程。
二、十六进制数互相转换  
二进制和十六进制的互相转换比较重要。不过这二者的转换却不用计算,每个C,C 程序员都能做到看见二进制数,直接就能转换为十六进制数,反之亦然。
我们也一样,只要学完这一小节,就能做到。
首先我们来看一个二进制数:1111,它是多少呢?
你可能还要这样计算:1 * 2 0   1 * 2 1   1 * 2 2   1 * 2 3  = 1 * 1 1 * 2 1 * 4 1 * 8 = 15
然而,由于1111才4位,所以我们必须直接记住它每一位的权值,并且是从高位往低位记,:8、4、2、1。即,最高位的权值为2 3  = 8,然后依次是 2 2  = 4, 21 =2, 2 0  = 1。
 
记住8421,对于任意一个4位的二进制数,我们都可以很快算出它对应的10进制值。
 
下面列出四位二进制数 xxxx 所有可能的值(中间略过部分)
 
仅4位的2进制数  快速计算方法   十进制值     十六进值
1111        = 8 4 2 1  = 15          F
1110        = 8 4 2 0  = 14          E
1101        = 8 4 0 1  = 13          D          
1100        = 8 4 0 0  = 12          C          
1011        = 8 4 0 1  = 11          B          
1010        = 8 0 2 0  = 10          A
1001        = 8 0 0 1  = 10          9
....
0001        = 0 0 0 1  = 1           1
0000        = 0 0 0 0  = 0           0
 
二进制数要转换为十六进制,就是以4位一段,分别转换为十六进制。
如(上行为二制数,下面为对应的十六进制):
 
1111 1101 , 1010 0101 , 1001 1011
F    D   ,  A    5   ,  9    B  
 
反过来,当我们看到 FD时,如何迅速将它转换为二进制数呢?
先转换F:
看到F,我们需知道它是15(可能你还不熟悉A~F这五个数),然后15如何用8421凑呢?应该是8 4 2 1,所以四位全为1 :1111。
接着转换 D:
看到D,知道它是13,13如何用8421凑呢?应该是:8 2 1,即:1011。
所以,FD转换为二进制数,为: 1111 1011
原码、反码、补码
比如,假设有一 int 类型的数,值为5,那么,我们知道它在计算机中表示为:
00000000 00000000 00000000 00000101
5转换成二制是101,不过int类型的数占用4字节(32位),所以前面填了一堆0。
现在想知道,-5在计算机中如何表示?
 
在计算机中,负数以其正值的补码形式表达
什么叫补码呢?这得从原码,反码说起。
 
原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。
比如 00000000 00000000 00000000 00000101 是 5的 原码。
 
反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。
取反操作指:原为1,得0;原为0,得1。(1变0; 0变1)
比如:将00000000 00000000 00000000 00000101每一位取反,得11111111 11111111 11111111 11111010。
称:11111111 11111111 11111111 11111010 是 00000000 00000000 00000000 00000101 的反码。
反码是相互的,所以也可称:
11111111 11111111 11111111 11111010 和 00000000 00000000 00000000 00000101 互为反码。
 
补码:反码加1称为补码。
也就是说,要得到一个数的补码,先得到反码,然后将反码加上1,所得数称为补码。
比如:00000000 00000000 00000000 00000101 的反码是:11111111 11111111 11111111 11111010。
那么,补码为:
11111111 11111111 11111111 11111010 1 = 11111111 11111111 11111111 11111011
 
所以,-5 在计算机中表达为:11111111 11111111 11111111 11111011。转换为十六进制:0xFFFFFFFB。
 
再举一例,我们来看整数-1在计算机中如何表示。
假设这也是一个int类型,那么:
 
1、先取1的原码:00000000 00000000 00000000 00000001
2、得反码:     11111111 11111111 11111111 11111110
3、得补码:     11111111 11111111 11111111 11111111