0

我不明白 int 63823 如何比双 1.0 占用更少的空间。在这种特定情况下,int 中是否没有存储更多信息?

4

5 回答 5

7

我不明白 int 63823 如何比双 1.0 占用更少的空间。在这种特定情况下,int 中是否没有存储更多信息?

好问题。当您看到63823并且1.0是基础数据的表示时所看到的,您不到基础数据。它经过特殊格式化,以便可以阅读它,但这不是机器看到它的方式。

Java 使用非常特殊的格式来表示intdouble。您需要查看这些表示以了解为什么63823在表示为 Java 时占用 32 位,而在表示为 Java 时int占用1.064 位double

特别是,63823int在 Java 中表示为:

00000000000000001111100101001111

和 1.0 作为 a在 Java 中double表示为:

0011111111110000000000000000000000000000000000000000000000000000

如果你想探索更多,我推荐Two's ComplementWhat Every Computer Scientist Should Know About Floating-Point Arithmetic

于 2013-06-29T18:29:49.863 回答
3

不完全是。双精度 1.0 表示更多信息,因为根据将双精度定义为 64 位浮点数,它可能有更多的值。使用您的示例,如果您有一个只能有两个值的特殊数据类型,63823 和 98321234213474932,那么它只需要 1 位来表示数字 63823,尽管它远不如 int 有用。

在实现方面,使用固定大小的数据类型通常更容易和更快,这样您就可以分配固定的内存块(这就是变量),而不必知道它的值并不断地重新分配空间。使用不同方法的变量示例是 String 和 BigInteger,它们确实分配空间来容纳它们的值。请注意,两者在 Java 中都是不可变的——这不是巧合。

于 2013-06-29T18:17:43.603 回答
1

这些原始数据类型需要在某个地方定义以供您使用。它不是一个灵活的容器,您可以随心所欲地塞入任何东西,而更像是一个瓶子,无论是满的还是空的,都占据相同的空间。他们也有一个他们可以包含的最大值。在这里阅读更多内容

于 2013-06-29T18:06:35.247 回答
1

未显示的零也计算在内。大约,忽略数字实际上以二进制而不是十进制存储的事实,当您将两个数字都包含隐含的零位写入时,您会得到:

1.0   = 1.00000000000000000*10^0000
63823 = 0000063823

如您所见,1.0 是 63823 的两倍。因此它需要两倍的存储空间。

于 2013-06-29T18:06:47.220 回答
0

int 和 double 根本没有十进制数字。int的十进制表示在删除前导零后有 8 个十进制数字。int 本身有 32 个二进制数字的空间。double 在尾数和一个 10 位指数和一个符号位中有 53 个二进制位的空间。

于 2013-06-30T01:49:27.807 回答