数字在计算机中的表示

计算机中表示数字的方式

在计算机中,数字是采用二进制表示的,在大部分开发语言中,通常使用8位、32位、64位二进制来表达数字

(1) 不同位数二进制可以表示的数字数量

一个二进制位可以有1和0两种取值,我们令用来表示数字的二进制位数为n,那么可以表示的数字数量就是2n个,如使用8位二进制来表示数字,那么可以表示的数字数量为:28= 256个

(2)如何区分正负

数字有正负之分,通常采用最高位为符号位,表示一个二进制串所表示的数字正负,最高位为1时数字是负数,最高位为0时,数字是正数或0

(3)具体的表示例子

以八位二进制为例,将八个二进制位从右往左编号,如下:

0 0 0 0 0 0 0 0
8 7 6 5 4 3 2 1

  • 正数表示,编号为8的最高位取值0
    编号为1的二进制位取值为1时,表示2^0 = 1
    编号位2的二进制位取值为1时,表示2^1 = 2
    编号为3的二进制位取值为1时,表示2^2 = 4

    编号为7的二进制位取值为1时,表示2^7 = 64
    当我们想要表示一个数字时,就可以将对应的二进制位取值为1,然后相加即可,如:5 = 4 + 1 = 00000101
    由此也可以得出8位的二进制位所能表示的最大数字为:64+16+8+4+2+1 = 127

  • 负数表示,编号为8的最高位取值为1
    有关负数的表示较为复杂,这是因为负数涉及到减法运算导致的,在计算机的设计中,为了节省资源,只有加法运算器而没有减法运算器,而减法运算可以通过加上一个负数的方式进行;

    那么负数应该如何表示呢?假设我们只将最高位设为1,其他位数的表示规则和正数一致,能否正确运算减法呢?可以做一个实验确认,假设要运算6-4,那么运算过程如下:
    6 = 00000110,-4 = 10000100,将二者按位相加,那么:

    6 - 4 = 6 + (-4) = 00000110 + 10000100 = 10001010 = -10

    很明显出现了问题,运算出错,于是乎就有了补码的出现用来表示负数解决该问题

    补码是通过取模的方式来表示负数的,什么是模呢?我们在玩游戏的时候当有某个职业或者某把武器数值过高,非常强时,就会说这个东西”超模“了,因此模可以理解为一个上限;

    再从一个日常例子入手,12小时制的时钟,每过12点就会从0开始重新计算,此时的12就是一个模,对12取模可以将大于12的数表示成[0.,11]之间的数,如:13 % 12 = 1,那么假设现在是10点,我们想要知道两个小时前的时间,这就涉及到了减法:

    10 - 2 = 8,

    而如果引入取模,那么还可以表示成:

    (10 + 10) % 12 = 8

    换句话说,我们可以通过取模的方式用一个正数去代表负数,那么这个正数应该如何取呢?留意到模为12,而12 = 10 + 2,也即一个负数的绝对值与代表该负数的正数之和刚好为模,原因如图:
    在这里插入图片描述
    在二进制中,负数也就是用取模的方式来表示的,在不考虑符号位的情况下,仅以二进制串来表示正数时,其取值范围是:[0,2n- 1],n是二进制位数,当二进制位均取0时表示0,均取1时表示2n- 1;
    而2n - 1 + 1 = 2n,需要一个更高位的1来表示,此时位数越界,现有二进制位清0,所以2n天生适合作为模;

    解决了模的问题后,就可以解决减法问题了,假设要计算 a - b,模为2n,n为二进制位数,那么就可以表示成a + (2n - b),将b按位取反,用~b表示,由b + ~b的结果是各二进制位都为1,可得:

    b + ~b = 2n - 1,即:2n - b = ~b + 1

    于是a + (2n - b)可以表示为:a + ~b + 1,也即-b 可以用 ~b + 1表示,到这里,负数的表示也就可以明确了,步骤如下:

    1. 首先取得该负数的绝对值|b|,为正数
    2. 接着对该绝对值按位取反再加1,即 ~|b| + 1
    3. 由于正数和0的最高位是0,取反后为1,所以负数的最高符号位都为1

最后需要明确的是,负数的取值之所以如此曲折,是为了解决减法的问题,而将正数的最高位规定为0后,运算后得到的负数二进制表示最高位也恰好为1,可用于区分正负,不得不感叹前人智慧

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值