美文网首页计算机原理程序员
有符号整型的数据范围为什么负数比正数多一个

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

作者: simon_2017 | 来源:发表于2017-08-25 15:22 被阅读0次

在JAVA中,有符号整型(long,int,short,byte)类型能表示的数据范围总是负数个数比正数要多一个,为什么?

以最简单(位数最短)的byte举例

System.out.println(Byte.BYTES);//输出1
System.out.println(Byte.SIZE);//输出8
System.out.println(Byte.MAX_VALUE);//输出127
System.out.println(Byte.MIN_VALUE);//输出-128

按照通常直觉,正负数不是对称的么,为什么负数最小不是-127,又或正数最大是128呢?

byte类型是8bit表示,那么可以表达的状态就有2^8=256个,如果表示无符号整数可以表达最小2进制00000000到最大2进制11111111(=255)共256个数字。

但是JAVA中整型都是有符号,区分就看第一个bit位,第一个bit如果是0则是正数,如果为1则是负数。看到这里就有疑问了,如果第一个bit位表示符号,那么剩下的7位能表示的范围只能是0到2^7-1=127了,岂不是全部数据范围就是-127~127(包括0)共255个数字,先前我们说了,8bit可以表达256个状态,怎么少了一个呢?
原来正0(00000000)和负0(100000000)都是0,计算意义上看也就是重复表达同样的意义,浪费了一个状态表示。为了不浪费资源,尽可能多的存储数据范围,先贤发明了补码表示负数,即一个负数可以用对应的正数的补码表示,而补码=(正数)原码取反(=反码)+1

现在我们用定义一个byte变量值是-127,内存如何存储呢?即求补码
1.127的2进制原码=01111111,
2.求反码=源码取反=10000000
3.反码加1后变成10000001,这就是-127的2进制表示

OK,现在反过来看,计算机指令看到一个byte类型变量值是10000001,怎么得到-127呢?
就是上面求补码的逆向过程,
1.发现第一bit位是1,知道这是补码,是负数
2.补码减1 得出反码=10000000
3.反码取反得到原码=01111111,这就是正数127的2进制表示
4.因此10000001的值就是-127

接下来继续解释:

  • byte的最大值为什么是127?
    因为第一个bit是符号位,那么正数最大只能是01111111=2^7 - 1 = 127

  • 0的补码和原码是一样的
    按照上面补码的求解过程
    0的原码=00000000→反码11111111 + 1→补码00000000(最高进位丢弃),嗯,也就是说正负0只用一个状态表示。

  • 为什么byte最小值是-128?
    我们已经了解,每一个正数有一个对应的补码表示负数,但是通过上面的分析,我们发现-127~127(包括0也没有重复表示)共255个状态,还有一个状态10000000没有利用,它是多少呢?
    1.发现第一bit位是1,知道这是补码,是负数
    2.补码减1 得出反码=01111111
    3.反码取反得到原码=10000000=(128)(我们说原码时,并没有提符号位,仅仅是2进制表示)
    注意补码和原码一致,似乎可以即表示128,也可表示-128,但注意与前面的定义保持一致,也为方便计算机识别处理,首位是1即是负数,因此只能是-128了。

相关文章

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

    在JAVA中,有符号整型(long,int,short,byte)类型能表示的数据范围总是负数个数比正数要多一个,...

  • C语言数据类型

    数的范围 有符号: 可以表示正数和负数 无符号: 只能表示正数 signed char num; 有符号数num...

  • 2018-10-28 CSAPP 第二章读书笔记part2

    2.2 整数表示 2.2.1 整数数据类型 有符号 无符号 负数比正数大一(有一个-0被表示为最小的那个负数) 2...

  • 二进制的原码和补码

    先验知识 正数的符号位是0 负数的符号位是1 正数的原码=反码=补码 负数的补码=负数的反码+1 负数的反码是由负...

  • Java 基本数据类型

    byte byte数据类型是8位、有符号整数;有符号指的是有正数和负数之分 最小值是-128(-2^7) 最大值是...

  • 负数

    负数是什么?负数就是,比0少的就叫做复数。正数是什么?正数就是比零大的。所以零他既不是负数,也不是正数。而是负数与...

  • MySQL数据类型

    整形 1、有符号值 代表可存储正数和负数 2、无符号值 代表只能存储正数 浮点型 日期时间型 字符型

  • 原码、反码和补码

    正数的原码、反码和补码相同,亦是正数 负数的原码、反码和补码符号位为1,代表负数,反码在原码的基础上符号位不变,其...

  • 整型

    整型 整型: 没有小数,包含负数,不同平台不会改变其取值范围分为以下4种 向下转型时候如果超出了对应的取值范围数据...

  • 原码、反码、补码

    原码:二进制前加一个符号位,正数为0,负数为1 反码:正数反码等于原码,负数反码为对原码数值位按位取反(即符号位仍...

网友评论

    本文标题:有符号整型的数据范围为什么负数比正数多一个

    本文链接:https://www.haomeiwen.com/subject/gcuudxtx.html