有符号整型数据范围为什么负数比正数多一个

884 阅读3分钟

在我们学习编程语言时都会遇到有符号整型和无符号整型,以8位举例的话,有符号整型的范围是[-128,127],而无符号整型的范围是[0,255],为什么有符号整型范围不是[-127,127]?

根据日常学习我们提出以下几个疑问:

疑问1:为什么有符号的8位整型范围是[-128,127]?

疑问2:正数和负数在计算机中是如何表示的?

根据这两个问题,我们依次进行相应的解答,首先无符号8位的整型在计算机系统中是以二进制表达的,范围是0000 0000 - 1111 1111 这样范围就是[0,255],可以表达的状态就有2^8=256个,有符号整型在计算机中是以第一个bit位进行区分的,第一个bit如果是0则是正数,如果是1则是负数,那么剩下的7位表示范围的话只能是2^7=127个,全部数据范围是[-127,127],状态值就是255个(包含0),上面我们说了8位表示的状态值是256个怎么少了一个呢,原来是正0(0000 0000)和负0(1000 0000)都是0,这样就重复表示了0,浪费了一个状态值,为了不浪费资源,先人就发明了补码表示负数。

  • 原码:符号位上加上真值的绝对值,即用第一位表示符号位,其余位表示值,比如如果是8位二进制:

    [+1] = 0000 0001
    [-1] = 1000 0001
    
  • 反码:正数的反码就是其本身,负数的反码就是在其原码的基础上符号位不变,其余各位取反

    [+1] = [00000001]原 = [00000001][-1] = [10000001]原 = [11111110]
  • 补码:正数的补码就是其本身,负数的补码就是其在原码的基础上,符号位不变,其余各位取反,最后+1

    [+1] = [00000001]原 = [00000001]反 = [00000001][-1] = [10000001]原 = [11111110]反 = [11111111]

上面我们解释了原码,反码和补码,在计算机中负数是以补码进行表示的,上面我们说了有符号的8位整型只有255个状态还有一个状态值怎么利用呢?还有一个没有利用的状态码是什么?

没有利用的状态码就是负0的状态码1000 0000,那它是多少呢,我们来计算下:

  1. 第一位是1,计算机就知道是负数,是用补码的形式表示的

  2. 补码 -1,得出反码位 0111 1111

  3. 反码取反得到原码 1000 0000则为正数128,而我们知道第一位是1,则这个数是-128,这就解释了有符号8位整型的范围是[-128,127]

我是爱耍流氓的唐僧,技术的路上总是要遇到不少妖怪的,作为一个流氓希望一路披荆斩棘在技术的路上越走越远!