进制

进制也就是进位计数制,是人为定义的带进位的计数方法(有不带进位的计数方法,比如原始的结绳计数法,唱票时常用的“正”字计数法,以及类似的tally mark计数)。 对于任何一种进制---X进制,就表示每一位置上的数运算时都是逢X进一位。 十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,x进制就是逢x进位。

现代的电子计算机技术全部采用的是二进制,因为它只使用0、1两个数字符号,非常简单方便,易于用电子方式实现。计算机内部处理的信息,都是采用二进制数来表示的。二进制(Binary)数用0和1两个数字及其组合来表示任何数。进位规则是“逢2进1”,数字1在同的位上表示不同的值,按从右至左的次序,这个值以二倍递增。

在计算机的内部,运行各种运算时,都是以二进制的方式来运行的。

对于整数,常用的进制有二进制、八进制、十进制以及十六进制

  • 二进制: 0, 1,满2进1
  • 八进制: 0 - 7,满8进1,计算机内以0开头表示
  • 十进制:0 - 9, 满10进1
  • 十六进制: 0-9及A-F,满16进1,计算机内以0x或者0X开头表示。此处的A-F不区分大小写,如0x21AF+1 = 0X21B0

不同进制的对比

十进制 十六进制 八进制 二进制
0 0 0 0
1 1 1 1
2 2 2 10
3 3 3 11
4 4 4 100
5 5 5 101
6 6 6 110
7 7 7 111
8 8 10 1000

进制转换

其他进制转十进制

规则:从最低位开始(右边的),将每个位上的数提取出来,乘以2的(位数-1)次方,然后求和。

  • 二进制转十进制
    1011 = 1 * 23+0 * 2 2+1 * 2 1+1 * 20 = 8 + 2 + 1 = 11
  • 八进制转十进制
    01011 = 1 * 83 + 0 * 82 + 1 * 81 + 1 * 80 = 521
  • 十六进制转十进制
    0x1011 = 1 * 163 + 0 * 162 + 1 * 161 + 1 * 160 = 4113

十进制转其他进制

  • 十进制转二进制
    规则:将该数不断除以2,直到商为0为止,然后将每步得到的余数倒过来,就是对应的二进制。

  • 十进制转八进制
    规则:将该数不断除以8,直到商为0为止,然后将每步得到的余数倒过来,就是对应的八进制。

  • 十进制转十六进制
    规则:将该数不断除以16,直到商为0为止,然后将每步得到的余数倒过来,就是对应的十六进制。

二进制转其他进制

  • 二进制转八进制
    规则:将二进制数每三位一组(从低位开始组合),转成对应的八进制数即可。
    11010101 => (11)(010)(101) => 0325
  • 二进制转十六进制
    规则:将二进制数每三位一组(从低位开始组合),转成对应的八进制数即可。
    11010101 => (1101)(0101) =>0xD5

其他进制转二进制

  • 八进制转二进制
    规则:将八进制的每1位,转成对应的一个三位的二进制数即可。
    0237 => (010)(011)(111) => 10011111
  • 十六进制转二进制
    规则:将八进制的每1位,转成对应的一个四位的二进制数即可。
    0x237 => (0010)(0011)(0111) => 1000110111

原码、反码、补码

在计算机内,定点数分为有符号数(signed)和无符号数(unsigned)。其中,有符号数的表示方法有三种:原码、反码和补码。

在计算机运算的时候,都是以补码的方式进行运算的。

三种表示方法均有符号位数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。

  • 原码
    原码(true form)是一种计算机中对数字的二进制定点表示方法。原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1(0有两种表示:+0和-0),其余位表示数值的大小。

优点:
简单直观;例如,我们用8位二进制表示一个数,+11的原码为00001011,-11的原码就是10001011

缺点:
原码不能直接参加运算,可能会出错。例如数学上,1+(-1) = 0,而在二进制中00000001+10000001=10000010,换算成十进制为-2。显然出错了。

  • 反码
    反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。

  • 补码
    补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。
    在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

  • 数的表示

在原码中,0的表示有两种(+0)0000 0000、(-0)1000 0000,这样就产生了编码映射的不唯一性,在计算机上就要区分辨别。然而+0、-0却没有什么现实意义。

  • 数的运算

为了解决上述数的表示问题,我们可以强制把转换后的10000000强制认定为-128。但这又出现了一个新的问题就是数的运算。数学上,1+(-1)=0,而在二进制中00000001+10000001=10000010,换算成十进制为-2。显然出错了。所以原码的符号位不能直接参与运算,必须和其他位分开,这就增加了硬件的开销和复杂性。
这个时候就要引入补码,补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。反码定义为:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。

  • 为什么要引入补码呢?

先解决第一个问题,引入补码是为了解决计算机中数的表示和数的运算问题,使用补码,可以将符号位和数值域统一处理,即引用了模运算在数理上对符号位的自动处理,利用模的自动丢弃实现了符号位的自然处理,仅仅通过编码的改变就可以在不更改机器物理架构的基础上完成的预期的要求。