java - 在Java中,字节的范围为 128到 127?

  显示原文与译文双语对照的内容
68 2

我不明白为什么一个字节的最小值是 -128我可以以看到最高值是 127,因为它是 01111111 中的,但是如何表示只有 8位的-128正 128已经为 8 -bit,换句话说,10000000,然后你需要一个 9th 位来表示负数。

请有人帮我解释一下。

时间:原作者:0个回答

145 1

答案是两个字母的补语。

简而言之,Java ( 和大多数现代语言) 不使用带符号的大小表示来表示有符号整数。换句话说,8-bit 整数不是后面跟着 7-bit 无符号整数的符号位。

相反,负整数在一个称为二进制的系统中表示,这使得硬件中的算法更加简单。消除负零的副作用是在范围的底部总是有一个额外的负数。

two的另一个有趣性质是,第一位does有效的函数作为符号指示符( 例如 。所有以位 1开头的数字都是负的,但是接下来的七位不作为符号位应用的未签名数。

两者的补充并非十分复杂,但是获得最初的grip 是什么和原因和原因可以能超出了这个答案。从维基百科文章开始,或者谷歌这个术语。

To -128个数字generating生成两个数字的complement的基本思想是获取数字的无符号形式,反转所有位,然后添加一个数字。所以未签名的128是 10000000.反转,它是 01111111,然后添加一个得到 10000000.所以在两个系统的一个补充中,10000000是明确的-128,而不是 +128.大于或者等于 +128的数字不能用两个系统的补充来表示,因为它们对负数的形式不明确。

原作者:
71 3

就像James指出的那样,这是因为这是两个作品的补充。

如果用其他术语来表示,你可以表示 2 ^8 = 256类型的值。即,在本例中使用 128负数,127正数和零。我们用 7位表示值,+1位表示一个符号,我们可以表示一个较小的值,也可以有两个零的值。

原作者:
139 4

一个字节由 8位组成。

00000000表示 0

11111111表示 255

但是,如果数字是这样的,我们无法区分数字是正数还是负数。由于这个原因,左边的钻头给了我们这个信息。如果左边的位是 0,你可以开始在 zero的顶部添加其他位的值。如果位是 1,你应该开始在 -128的顶部添加。因为左边的钻头是二到七的幂。

例子;

在这些示例中,左侧的位为 1,意味着我们在 -128上添加了它的他位的值。

10000000 = -128 ( -128 + 0 )

10000001 = -127 ( -128 + 1 )

10000011 = -125 ( -128 + 3 )

10000111 = -121 ( -128 + 7 )

相同的字节,但这一次,左边的位是 0也就是说,我们开始在 0的顶部添加。

00000000 = 0 ( 0 + 0 )

00000001 = 1 ( 0 + 1 )

00000011 = 3 ( 0 + 3 )

00000111 = 7 ( 0 + 7 )

如果我们可以以直到现在,问题的答案,最小可以能的数字,具有 8位的最小值是:

10000000 = -128

最大的可能数

011111111 = 127

这就是为什么范围介于到 127之间。

原作者:
...