在 C 中,
- 有符号整数变量可以存储负数和正数
- 无符号整数变量只能存储正数
但是,它们都将分配 4 个字节的内存。我读了一本书,它说如果你想存储正数,我们考虑使用无符号整数变量,这样可以节省内存。如果有符号和无符号变量都分配相同大小的内存,4 字节,如何节省内存?
5 回答
(这个答案现在是关于 C,而不是 Java。)
如果有符号和无符号变量都分配相同大小的内存,两个字节,如何节省内存?
不同之处在于,即使它们具有相同的宽度,这两种类型也可以表示不同的值范围。这意味着如果您选择有符号而不是无符号,有时您必须使用更广泛的类型。
例如,假设您需要表示一个介于 0 和 60,000 之间的值。为此,您有多种选择:
- 使用 16 位无符号整数;
- 使用 32 位有符号整数。
如您所见,您必须为此范围选择更广泛的有符号类型。您不能使用 16 位有符号整数,因为它最多只能达到 32,767。
java中没有无符号整数类型(来自另一个主题的char)
在有符号数字的语言中,它们不节省内存,而是支持更大的正值,并且还提供了一种明确声明给定值不能为负的方法。
直接回答您的问题:如果您需要存储 0 到 65535 之间的值,那么您可以使用一个无符号的两字节值。但是如果你使用有符号值,你将被迫使用更多字节,因为一个两字节的有符号值最多只能存储 32767。你可能不得不使用一个 4 字节的有符号值,这当然是存储的两倍.
你是对的,无论它如何表示,4 个字节都是 4 个字节。在 Java 中使用 unsigned 可以提供帮助的唯一情况是,如果您的范围为 0 - 65535,并且您可以选择char
或int
。在这种情况下char
较小。注意:在 a 中存储无符号数字char
通常比有用更令人困惑。
通常,您不会节省内存,因为在大多数情况下,您使用的整数类型的大小比所需的大得多——通常您的值在 32 中的范围为 0..10 左右-bit int 范围为 +/- 20 亿,而 4 位可以。
从历史上看,有一些语言和计算机系统将数字“打包”成“奇数”位数(并且不止一些使用 4 位十进制数字),但没有“现代”语言(我忽略了RPG 和 COBOL,抱歉)就是这样做的。
因此,您可以使用无符号值来节省存储空间,但这种情况很少见。
但是,了解这两种类型之间的区别很重要,因为无符号值可能会以意想不到的方式表现。例如,(目前还不是最奇怪的情况)for( unsigned int i = 100; i < 0; i--)
是一个无限循环,因为i
它永远不会小于零。
因此,对于无符号整数,就有龙。