Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 有符号与无符号数字_C - Fatal编程技术网

C 有符号与无符号数字

C 有符号与无符号数字,c,C,在C语言中, -有符号整数变量可以存储正数和正数 -无符号整数变量只能存储正数 但是,它们都将分配4个字节的内存。我读了一本书,它说如果你想存储正数,我们考虑使用无符号整型变量,这样它就可以节省内存。如果有符号变量和无符号变量都分配相同大小的内存(4字节),它如何节省内存呢 如果有符号变量和无符号变量分配相同大小的内存(两个字节),它如何节省内存 区别在于,即使它们具有相同的宽度,这两种类型也可以表示不同的值范围。这意味着,如果选择“已签名”而不是“未签名”,有时必须使用更广泛的类型 例如,假设

在C语言中,
-有符号整数变量可以存储正数和正数
-无符号整数变量只能存储正数
但是,它们都将分配4个字节的内存。我读了一本书,它说如果你想存储正数,我们考虑使用无符号整型变量,这样它就可以节省内存。如果有符号变量和无符号变量都分配相同大小的内存(4字节),它如何节省内存呢

如果有符号变量和无符号变量分配相同大小的内存(两个字节),它如何节省内存

区别在于,即使它们具有相同的宽度,这两种类型也可以表示不同的值范围。这意味着,如果选择“已签名”而不是“未签名”,有时必须使用更广泛的类型

例如,假设您需要表示一个介于0和60000之间的值。为此,您有几种选择:

  • 使用16位无符号整数
  • 使用32位有符号整数
如您所见,您必须为此范围选择更宽的签名类型。您不能使用16位有符号整数,因为它最多只能达到32767

  • java中没有无符号整数类型(另一个主题是char的appart)

  • 在有符号数字的语言中,它们不节省内存,而是支持更大的正值,还提供了一种明确声明给定值不能为负值的方法


  • 直接回答您的问题:如果需要存储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正确,谢谢。我已经修改了我的措辞