1

例如,Java 数据类型字节将 -128 到 127 的数据保存在存储中的单个字节中。为了能够区分 - 1 到 -128 和 0 到 127 将需要额外的数据,这些数据将使数据类型超出其分配的存储空间。诚然,它只需要额外的一点,但它仍然会过去。

java是如何做到这一点的?

4

1 回答 1

9

二进制补码

基本类型在所有机器和所有实现中都被定义为相同,并且是各种大小的二进制补码整数、单精度和双精度 IEEE 754 标准浮点数、布尔类型和 Unicode 字符类型。—<em> Java 语言规范:简介

你可以把它想象成一个从 0 到 255 的整数,总是减去 128。

更具技术性:整数可以(并且将会)通过反转其位并加一来否定(正→负或反之亦然)。这几乎就像一个补码(它只是将所有位反转 - 因此是补码。但是一个补码的问题是它有两个不同的零:+0 和 -0(浮点数也有,但出于其他原因并且更有用) ☺). 二进制补码通过加一解决了这个问题,从而扩展了负值的范围(这就是为什么它是-128 ..127)。

在某种程度上,您可以说该符号确实“存储”在数字的第一位。所以你观察到它需要一点存储是正确的。但是a的数值范围byte(正数或负数,忽略符号)只需要7位,所以你又多了一个字节。

于 2009-11-03T22:56:14.903 回答