我正在学习c语言,有两种不同的整数类型,带符号/无符号。
带符号整数可以同时显示正数和负数。我们为什么 需要无符号整数吗?
答案 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