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