专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

byte的取值范围是[-128,127]?我迷了!

byte的取值范围为什么是[-128,127]?

这是个老生常谈的问题了,我们都知道byteshortintlongJava中8大基本数据类型的整型,但对于他们的取值范围,在初学时,或多或少都有一些疑虑,比如:byte的取值范围为什么是[-128,127],而不是[-127,127]呢?

要搞清这个问题,首先需要了解几个概念(以8位二进制为例):

机器数

我们都知道计算机只认识0和1,只认识二进制,机器数是数字在计算机中的二进制表现形式,机器数是有符号的,通常符号位放在最高位,0表示正数(+),1表示负数(—)。

因为有符号占据一位,数的形式值就不等于真正的数值,带符号位的机器数对应的数值称为机器数的真值。 例如二进制真值数-0011011,它的机器数为 10011011。


原码

原码(true form)是一种计算机中对数字的二进制定点表示方法。原码=符号位+真值的绝对值。

例如:

+1 = [00000001]

-1 = [10000001]

0有两种表示方式:

+0 = [00000000]

-0 = [10000000]

  • 优点:简单直观,易于人脑理解。
  • 缺点:不能直接带符号位参加运算,可能会出错。例如数学上,1+(-1)=0,而在8位二进制中[00000001]+[10000001]=[10000010],换算成十进制为-2。显然出错了。

反码

正数的反码原码相同。

负数的反码是在其原码的基础上,符号位不变,剩下的按位取反,也就是0变1,1变0。

例如:

+1 = [00000001] = [00000001]

-1 = [10000001] = [11111110]

0依然有两种表示方式:

+0 = [00000000] = [00000000]

-0 = [10000000] = [11111111]


补码

正数的补码与其原码相同。

负数的补码是在其反码的基础上再加1。

例如:

+1 = [00000001] = [00000001] = [00000001]

-1 = [10000001] = [11111110] = [11111111]

0只有唯一一种表示方式了:

+0 = [00000000] = [00000000] = [00000000]

-0 = [10000000] = [11111111] = [00000000]

解惑

那么现在就可以来回答文章开始的问题了,为什么byte的取值范围是[-128,127],而不是[-127,127]呢?计算机使用二进制来表示数,最大值是[01111111]表示127,这个没有疑问,最小值不应该是[11111111]表示-127吗?为什么是[10000000]表示-128呢?难道我学的是个假的二进制???

其实不是二进制的问题,只是计算机使用的是补码来表示数,而不是原码,至于为什么使用补码不使用原码,这里就不细讲了,有兴趣的可以去了解一下。

(-1) + (-127) = [10000001] + [11111111] = [11111110] + [10000000] = [11111111] + [10000001] = [10000000]

这就是问题的答案。

[10000000]表示-128,是通过补码运算得出来的,但是它并没有原码和反码表示,因为它其实是占了-0的位置,使用[10000000]算出原码是错误的。

错误示范:

[10000000]`补` = [01111111]`反` = [00000000]`原`

拓展(byte、short、int、long)

取值范围主要和这些类型存储数据时所占的字节数有关。

  • 1字节 = 8位(bit)

byte: 存储数据占一个字节,取值范围是-128(-2^7) ~ 127(2^7 -1)
short: 存储数据占两个字节,取值范围是-32,768(-2^15) ~ 32,767(2^15 -1)
int: 存储数据占四个字节,取值范围是-2,147,483,648(-2^31) ~ 2,147,483,647(2^31 -1)
long: 存储数据占八个字节,取值范围是-9,223,372,036,854,775,808(-2^63) ~ 9,223,372,036,854,775,807(2^63 -1)

文章永久链接:https://tech.souyunku.com/34191

未经允许不得转载:搜云库技术团队 » byte的取值范围是[-128,127]?我迷了!

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们