C 有符号与无符号数字
在C语言中,C 有符号与无符号数字,c,C,在C语言中, -有符号整数变量可以存储正数和正数 -无符号整数变量只能存储正数 但是,它们都将分配4个字节的内存。我读了一本书,它说如果你想存储正数,我们考虑使用无符号整型变量,这样它就可以节省内存。如果有符号变量和无符号变量都分配相同大小的内存(4字节),它如何节省内存呢 如果有符号变量和无符号变量分配相同大小的内存(两个字节),它如何节省内存 区别在于,即使它们具有相同的宽度,这两种类型也可以表示不同的值范围。这意味着,如果选择“已签名”而不是“未签名”,有时必须使用更广泛的类型 例如,假设
-有符号整数变量可以存储正数和正数
-无符号整数变量只能存储正数
但是,它们都将分配4个字节的内存。我读了一本书,它说如果你想存储正数,我们考虑使用无符号整型变量,这样它就可以节省内存。如果有符号变量和无符号变量都分配相同大小的内存(4字节),它如何节省内存呢 如果有符号变量和无符号变量分配相同大小的内存(两个字节),它如何节省内存 区别在于,即使它们具有相同的宽度,这两种类型也可以表示不同的值范围。这意味着,如果选择“已签名”而不是“未签名”,有时必须使用更广泛的类型 例如,假设您需要表示一个介于0和60000之间的值。为此,您有几种选择:
- 使用16位无符号整数李>
- 使用32位有符号整数
直接回答您的问题:如果需要存储0到65535之间的值,那么可以使用一个无符号的两字节值。但如果您使用有符号值,您将被迫使用更多字节,因为两字节有符号值最多只能存储32767个字节。您可能必须使用4字节的有符号值,这当然是存储空间的两倍。您是对的,4字节就是4字节,不管它是如何表示的。在Java中使用unsigned可以起到帮助作用的唯一情况是,范围为0-65535,并且可以选择
char
或int
。在这种情况下,char
较小。注意:将无符号数字存储在字符中通常比有用的数字更容易混淆。一般来说,您不会节省内存,因为在大多数情况下,您使用的整数类型的大小远远大于所需的大小-通常在32位整数中有一个范围为0..10左右的值,范围为+/-20亿,4位就可以了
历史上,有一些语言和计算机系统将数字“打包”成“奇数”位(还有更多的语言使用4位十进制数字),但没有任何“现代”语言(对不起,我忽略了RPG和COBOL)能做到这一点
所以,偶尔可以使用无符号值来节省存储空间,但这种情况很少
但是,理解这两种类型之间的差异很重要,因为无符号值可能以意外的方式运行。例如,(这不是目前最奇怪的情况)for(unsigned int i=100;i<0;i--)
是一个无限循环,因为i
永远不能小于零
无符号整数也有龙。有char
,它是一个无符号的16位整数。@slekcher那么你想知道关于Java
或C
的答案吗?Java中的所有数字类型都有符号,除了char。它们并不都是2字节长。字节为1字节,int为4字节,long为8字节。要么你的书是错的,要么不是关于Java的,要么你读得不对。提供更多上下文。此外,标准整数有四个字节,而不是两个。根据定义,2字节是一个“短”字节。如果你的问题是关于C,为什么要用Java来标记它???范围的大小是相同的,它的位置是不同的。也就是说,字符是-128到127对0到255。@vonbrand正确,谢谢。我已经修改了我的措辞