有符号整数和无符号整数

时间:2019-02-06 15:22:22

标签: c unsigned-integer

我正在学习c语言,有两种不同的整数类型,带符号/无符号。

带符号整数可以同时显示正数和负数。我们为什么 需要无符号整数吗?

5 个答案:

答案 0 :(得分:0)

  • sizeof类型具有额外的存储空间,对于正值,最大允许值为2 CHAR_BIT * sizeof(type) -1。这就是为什么unsigned之类的用于存储文件,字符串,数组等大小的类型是无符号的。

    对于带符号的整数,该符号保留一位,因此,如果size_t的长度为32位,则只有31位存储数字的大小。 int没有此限制; MSB也用于幅度,但这是以不再能够为负的代价为代价的。

  • C标准未定义带符号整数溢出,而保证无符号整数溢出可以环​​绕并重置为零。例如,以下代码调用C中的未定义行为:

    unsigned int

    鉴于此,可以保证回绕为零:

    int a = INT_MAX;
    a++;
    
  • 无符号类型通常更适合在以下位置执行位操作

答案 1 :(得分:0)

一个词的答案是“范围”!

声明有符号整数时,它将占用4字节/ 32位内存(在32位系统上)。 在这32位中,1位用于符号,其他31位表示数字。表示您可以代表-2,147,483,648到2,147,483,647之间的任何数字,即2 ^ 31。

如果要使用2,147,483,648,该怎么办?去8个字节?但是,如果您对负数不感兴趣,那不是浪费4个字节吗?

如果您使用unsigned int,则所有32位都代表您的数字,因为您无需保留1位用于符号。因此,使用unsigned int,您可以从0到4,294,967,295,即2 ^ 32

对于其他数据类型同样适用。

答案 2 :(得分:0)

所有与内存有关。它们用于表示更大的数字,而无需使用大量的内存。

数字以二进制形式存储在计算机上。带符号的数值使用称为二进制补码的过程将正数转换为负数,其中任何计算均不考虑第一位(可以表示最大值的位)。

这意味着您选择的数字带符号类型最多只能存储N个可用位的最大值减去1位,其余位将用于确定值的符号,而您选择的无符号类型可以使使用所有可用位来存储其值,但缺点是无法表示负值。

答案 3 :(得分:0)

有两个/三个原因,因为C必须为程序员提供最大范围的可能性。

第一个是无符号整数相对于其有符号对应物可以具有双精度(正)值。而且我们不想浪费任何一点权利吗?

第二个是协议或程序必须处理的某些数据结构可以使用无符号值,因此具有该数据类型很方便。

第三点是处理器实际上具有无符号类型,因此C语言使它们可用。例如,可能有一些算法会在溢出时进行中继。

还有其他动机,也许我不记得所有。

就个人而言,我在嵌入式应用程序中大量使用无符号整数。例如,使用单个无符号char作为256个元素的循环缓冲区中的索引,可以轻松快捷地增加索引,而无需检查溢出,因为当索引溢出时,它确实可以执行我想要的操作(重置归零)。同样,可能还有很多其他情况,我只想出第一种。

答案 4 :(得分:0)

原因是Integer始终具有固定大小。在大多数系统上,整数是32位大。

因此,无论具有带符号的整数还是未带符号的整数,它始终占用相同的内存量。这就是有符号和无符号的区别:范围

其中无符号整数的范围是0到4294967295(2³²-1),而有符号整数的范围是-2147483647到2147483648