我不明白 int 63823 如何比双 1.0 占用更少的空间。在这种特定情况下,int 中是否没有存储更多信息?
5 回答
我不明白 int 63823 如何比双 1.0 占用更少的空间。在这种特定情况下,int 中是否没有存储更多信息?
好问题。当您看到63823
并且1.0
是基础数据的表示时所看到的,您看不到基础数据。它经过特殊格式化,以便您可以阅读它,但这不是机器看到它的方式。
Java 使用非常特殊的格式来表示int
和double
。您需要查看这些表示以了解为什么63823
在表示为 Java 时占用 32 位,而在表示为 Java 时int
占用1.0
64 位double
。
特别是,63823int
在 Java 中表示为:
00000000000000001111100101001111
和 1.0 作为 a在 Java 中double
表示为:
0011111111110000000000000000000000000000000000000000000000000000
如果你想探索更多,我推荐Two's Complement和What Every Computer Scientist Should Know About Floating-Point Arithmetic。
不完全是。双精度 1.0 表示更多信息,因为根据将双精度定义为 64 位浮点数,它可能有更多的值。使用您的示例,如果您有一个只能有两个值的特殊数据类型,63823 和 98321234213474932,那么它只需要 1 位来表示数字 63823,尽管它远不如 int 有用。
在实现方面,使用固定大小的数据类型通常更容易和更快,这样您就可以分配固定的内存块(这就是变量),而不必知道它的值并不断地重新分配空间。使用不同方法的变量示例是 String 和 BigInteger,它们确实分配空间来容纳它们的值。请注意,两者在 Java 中都是不可变的——这不是巧合。
这些原始数据类型需要在某个地方定义以供您使用。它不是一个灵活的容器,您可以随心所欲地塞入任何东西,而更像是一个瓶子,无论是满的还是空的,都占据相同的空间。他们也有一个他们可以包含的最大值。在这里阅读更多内容。
未显示的零也计算在内。大约,忽略数字实际上以二进制而不是十进制存储的事实,当您将两个数字都包含隐含的零位写入时,您会得到:
1.0 = 1.00000000000000000*10^0000
63823 = 0000063823
如您所见,1.0 是 63823 的两倍。因此它需要两倍的存储空间。
int 和 double 根本没有十进制数字。int的十进制表示在删除前导零后有 8 个十进制数字。int 本身有 32 个二进制数字的空间。double 在尾数和一个 10 位指数和一个符号位中有 53 个二进制位的空间。