进制转换以及原码、反码、补码

2进制,用两个阿拉伯数字:0、1;

8进制,用八个阿拉伯数字:0、1、2、3、4、5、6、7;

10进制,用十个阿拉伯数字:0、1、2、3、4、5、6、7、8、9;

16进制,用十六个阿拉伯数字:0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F
(A是10)

后缀:O表示八进制数 H表示十六进制 B表示二进制 D表示十进制数

8进制是用3位二进制数来代替每一位八进制数

16进制是用4位二进制数来代替每一位十六进制数


10进制数:
10进制数转换为几进制就除以几,直到除到商为0,则所有余数的倒序则为转换结果!

2进制数:

2 -> 8 :把二进制数每三位一组,然后每三位的最高位为4,第二位为2,最低位为1
((1100100)2=(001 100 100)2=(1 4 4)8)

2 -> 10 :利用权值计算:
0110 0100,转换为10进制为0 * 2 ^ 0 + 0 * 2 ^ 1 + 1 * 2 ^ 2 + 0 * 2 ^ 3 + 0 * 2 ^ 4 + 1 * 2 ^ 5 + 1 * 2 ^ 6 + 0 * 2 ^ 7 = 100

2 -> 16 :把二进制数每四位一组,分别转换为十六进制(利用权值计算),每四位的最高位为8,第二位为4,第三位为2,最低位为1
11101101转换方法:结果为ED
高位:1110=1x8 + 1x4 + 1x2 + 0x1=(14)十进制=(E)十六进制,8为2的三次方权值,4为2的二次方权值
低位:1101=1x8 + 1x4 + 0x2 + 1x1=(13)十进制=(D)十六进制,

8进制数:

8 -> 2 :每位八进制数用3位二进制数表示

(37.416)8 =>011 111 .100 001 110 =>(11111.10000111)2 然后每三位的最高位为4,第二位为2,最低位为1

8 -> 10 :利用权值计算:八进制数第0位的权值为8的0次方,第1位权值为8的1次方,第2位权值为8的2次方...
将八进制数12.6转换成十进制数
(12.6)8 = 1×8^1 + 2×8^0 + 6×8^-1 = (10.75)10

8 -> 16 :先将八进制化为二进制,再将二进制化为十六进制
八进制数256 转换为16进制数=
(三位一组) 010, 101, 110 =
(四位一组) 0, 1010, 1110 = 0AE = AE

16进制数:
16 -> 2 :一位十六进制对应四位二进制数,每四位的最高位为8,第二位为4,第三位为2,最低位为1
十六进制数3FC3H转换为相应的二进制数: 将3FC3H从低位开始转换
3 --- 0011
C --- 1100
F --- 1111
3 --- 0011
将对应的二进制数按顺序排好,转换成二进制数的结果是0011 1111 1100 0011, 即11111111000011

16 -> 8 :先转为二进制再转为八进制

 十六进制16AH转化为八进制数: 

(16A)H =(0001 0110 1010)B = (101 101 010)B = (552)这个是八进制

16 -> 10 :16进制数第0位的权值为16的0次方,第1位权值为16的1次方,第2位权值为16的2次方……
7E8F
F*16^0+8*16^1+E*16^2+7*16^3=32399

只要记住2、8、16进制转换为10进制就可以了!因为10进制转换为其他进制就简单了!


10进制的小数转换为其他进制数的情况:
整数位:10进制数转换为几进制就除以几,直到除到商为0,则所有余数的倒序则为转换结果!
小数位:10进制数转换为几进制就乘以几,直到乘到为整数,则所有整数位的正序则为转换结果!
(0.3125*8=2.5 整数位为2 0.5*8=4 整数位为4 则小数位的结果为24)

(1)原码表示法

原码表示法是机器数的一种简单的表示法。其符号位用0表示正号,用1表示负号,数值一般用二进制形式表示。

  例如,X1= +1010110 

          X2= 一1001010 

    其原码记作: 

            [X1]原=[+1010110]原=01010110 

            [X2]原=[-1001010]原=11001010

(2)补码表示法

机器数的补码可由原码得到。如果机器数是正数,则该机器数的补码与原码一样;如果机器数是负数,则该机器数的补码是对它的原码(除符号位外)各位取反,并在未位加1而得到的。

例如      [X1] = +1010110 

            [X1]原=01010110 

            [X1]补=01010110 

            [X2]    =-1001010 

            [X2]原 =11001010 

            [X2]补 =10110101+1

                      =10110110

(3)反码表示法

机器数的反码可由原码得到。如果机器数是正数,则该机器数的反码与原码一样;如果机器数是负数,则该机器数的反码是对它的原码(符号位除外)各位取反而得到的。

   例如:X1   = +1010110 

        [X1]原=01010110 

         [X1]  反=01010110 


          X2  =  -1001010 

         [X2]原=11001010 

         [X2]反=10110101

(4)由补码求原码

正数:原码和补码一样

负数:符号位不动,其余位取反,然后+1

例如:  补码:                    1111 1001

          取反(符号位不动)    1000 0110

          加1                         1000 0111 = -7(D)

(5)由反码求原码

正数:原码和反码一样

负数:符号位不动,其余位为取反

例如: 补码:                     1111 1000

          取反(符号位不动)    1000 0111 = -7(D)

正数的原码和反码、补码是一样的!

在内存中计算机是用原码来表示正数的,用补码来表示负数的,并且是以十六进制显示的!

 在这里,我们还要知道“不同的数据类型占据的空间不同

通常:char为1字节,short为2个字节,int为4个字节,double为8个字节

1字节为8位,24=16,数据在内存中是以16进制显示的,所以char类型的数据是以2位十六进制数据显示的!

而int类型为4*8=32位,那么是以8位十六进制显示的!

补码运算可以一步实现目标,无论同号加法还是异号加法

而原码计算的话,要先判断符号,然后再比较绝对值,判断符号,需要三步,所以计算机都是用的补码

2+7=9

          原码                反码                补码 

+2  0000 0010      0000 0010      0000 0010
+7  0000 0111      0000 0111      0000 0111
+9  0000 1001      0000 1001      0000 1001

可以看出 (0000 1001)2 =910,因为是正数相加,所以用两个数的原码相加即可!

-9+7=-2

          原码                反码                补码 

+7  0000 0111      0000 0111      0000 0111
-9   1000 1001      1111 0110      1111 0111
-2   1000 0010      1111 1101      1111 1110  

 因为计算机内存中负数的表示形式为补码,所以-2的补码为1111 1110,而-2的补码可以由这两个数的补码相加得出来!而非这两个数的原码相加得出来的!

原文地址:https://www.cnblogs.com/MrZivChu/p/jinzhizh.html