我可以存储-127到127之间的数字,但除此之外不可能,编译器会发出警告。二进制值127是01111111,130是10000010仍然是相同的大小(8位),我认为我可以存储130字节但不可能。这是怎么发生的?
答案 0 :(得分:5)
Java没有无符号类型,Java中的每个数字类型都是有符号的(char
除外,但不代表数字而是unicode字符)。
让我们来看看byte
。它是一个8位的字节。 如果它将是无符号的,是的,它的范围将是0..255。
但如果它是有符号的,则需要1位信息来存储符号(2个可能的值:+或 - ),这使我们留下7位来存储数字(绝对)值。 7位信息的范围是0..127。
请注意,有符号整数的表示在大多数语言中使用2's complement数字格式,包括Java。
注意: Java byte
类型的范围实际上是-128..127。范围-127..127仅包含255个数字(不是256,这是8位的所有组合的数量)。
答案 1 :(得分:2)
在Java中,byte
是签名的数据类型。您正在考虑无符号字节,在这种情况下,可以将值130存储为8位。但是对于带符号的数据类型,它也允许使用负数,第一位是必要的,表示负数。
有两种方法可以存储负数,(one's complement和two's complement),但最受欢迎的方法是二进制补码。它的好处是,对于二进制补码,大多数算术运算不需要考虑数字的符号;无论标志如何,他们都可以工作。
答案 2 :(得分:1)
第一位表示数字的符号:当第一位为1时,则数字为负数。当第一位为0时,则该数字为正。所以你基本上只有7位可用于存储数字的幅度。 (使用一个小技巧,对于负数,这个幅度会偏移1 - 否则,"零"将有两个不同的位模式,即00000000和10000000)。
如果要存储130的数字,其二进制表示为10000010,则由于第一位为1,它将被解释为负数。
另见http://en.wikipedia.org/wiki/Two%27s_complement,其中更详细地解释了幅度如何移动的技巧。