代码之家  ›  专栏  ›  技术社区  ›  Bad Request

为什么Java中的字节范围是128到127?

  •  60
  • Bad Request  · 技术社区  · 14 年前

    我不明白为什么一个字节能取的最小值是 -128 127 ,因为它是 01111111 只有8位,其中一位用于标志?正数128已经是8位了,即。 10000000 ,然后需要第9位来表示负号。

    有人能帮我解释一下吗。

    8 回复  |  直到 12 年前
        1
  •  94
  •   Tyler McHenry    14 年前

    答案是 two's complement

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

    相反,负整数在称为2的补码的系统中表示,这使得硬件中的算术处理更容易,并且还消除了正零和负零的潜在模糊性。消除负零的一个副作用是,在范围的底部总是有一个额外的负数可用。

    二的补码系统的另一个有趣的性质是,第一位是 有效地

    二的补语并不十分复杂,但初步掌握二的补语是什么,它是如何工作的,为什么工作,可能超出了所谓的答案的范围。从维基百科的文章开始,或者用谷歌搜索更多资源。

    为了简单地回答关于-128的查询,生成2的补码的基本思想是采用数字的无符号形式,反转所有位并加1。所以无符号128是10000000。倒过来,是01111111,再加上一个就得到10000000。所以在2的补码系统中,10000000是明确的-128而不是+128。大于或等于+128的数字不能用2的补码系统用8位表示,因为它们与负数的形式不明确。

        2
  •  33
  •   Ad Infinitum    5 年前

    两人的互补作用如下;

    一个字节由8位组成。

    00000000表示0

    11111111表示255

    0 ,则可以开始在 zero . 如果钻头 1 -128

    实例;

    10000000 = -128 (-128 + 0)

    10000001 = -127 (-128 + 1)

    相同的位,但这一次,左边的位是 0 . 这意味着我们开始在 .

    00000000 = 0 (0 + 0)

    00000001 = 1 (0 + 1)

    00000011 = 3 (0 + 3)

    00000111 = 7 (0 + 7)

    最小可能数

    最大可能数

    011111111 = 127

    这就是为什么范围介于 -128和127

        3
  •  8
  •   Tamás Szelei    14 年前

    正如詹姆斯在评论中指出的那样,这是因为二的补码就是这样工作的。

    如果我们用其他术语来表示,你可以表示2^8=256种值。也就是说,在这个例子中用128个负数,127个正数和零。如果我们用7位来表示值,+1位表示符号,我们可以少表示一个值,也可以有两个零(这将是非常不幸的,因为比较两个值会更加复杂)。

        4
  •  3
  •   Sic    8 年前

    基本数字类型可以表示2^n个数字。看一个n=2的例子。你可以代表四种情况,我们称之为a,b,c,d。然后你可以同意其中一种 a=-2, b=-1, c=0, d=1 (这是公认的方式)或 a=-1, b=0, c=1, d=2 abs(min) != max 增加 n 移动边界,但是 仍然有效。

        5
  •  3
  •   Mina Fawzy    8 年前

    所以范围-2^7负(-128)到2^7-1正(127)

        6
  •  1
  •   Andrei Bazavan    11 年前

    所以看起来是这样的:




    这是否定的
    -|0001001
    0|0001001
    作为字节 简短的否定是
    -000000011111111
    0000000011111111

        7
  •  0
  •   David Hollowell - MSFT    8 年前

    不需要二的互补: 2^8(因为一个字节是8位数字,可以有2个值中的1个)=256,所以一个字节可以代表的最大值是256。 所以,代表数字-128到-1是我们范围的一半。 我相信这里的问题是为什么最大正值是127而不是128。这是因为我们必须表示数字0,所以包括0-127是我们范围内的其他128个可能性。

    如果我们只允许正值,例如不允许负数的无符号字节,那么范围将是0-255,因为这是256个不同的值(包括0)。

        8
  •  0
  •   Rashid Ali    6 年前

    在接受了两个数字的恭维之后,我们总是留下一个表示额外数字的状态,所以我们把这个状态变成-128。