signed和unsigned int的区别是什么?
signed和unsigned int有什么区别?
正如你可能知道的, int
s是以二进制内部存储的。 通常一个int
包含32位,但在某些环境中可能包含16位或64位(甚至是不同的数字,通常但不一定是2的幂)。
但是对于这个例子,我们来看看4位整数。 微小,但用于说明的目的。
由于在这样的整数中有四个比特,所以它可以假设16个值中的一个; 16是2到4次方,2次2次2次2.这些值是多less? 答案取决于这个整数是一个有signed int
还是一个unsigned int
。 使用unsigned int
,该值从不是负数; 没有与价值相关的标志。 以下是四位unsigned int
的16个可能的值:
bits value 0000 0 0001 1 0010 2 0011 3 0100 4 0101 5 0110 6 0111 7 1000 8 1001 9 1010 10 1011 11 1100 12 1101 13 1110 14 1111 15
…以下是四位有signed int
的16个可能的值:
bits value 0000 0 0001 1 0010 2 0011 3 0100 4 0101 5 0110 6 0111 7 1000 -8 1001 -7 1010 -6 1011 -5 1100 -4 1101 -3 1110 -2 1111 -1
正如你所看到的,对于有signed int
,当且仅当数字是负数时,最重要的位是1
。 这就是为什么对于有signed int
,这个位被称为“符号位”。
有时我们事先知道,存储在一个给定的整数variables中的值总是正值 – 例如,当它被用于计算事物时。 在这种情况下,我们可以声明variables是无符号的,如下所示, unsigned int num student;
。 通过这样的声明,允许的整数值(对于32位编译器)的范围将从-2147483648范围移动到+2147483647范围0到4294967295.因此,声明一个整数作为无符号数,几乎使最大可能的大小加倍它可以保持的价值。
用外行的术语来说,unsigned int是一个整数,不能是负数,因此它有更高的正值范围。 带符号的int是一个整数,可以是负数,但是可以使用一个较低的正数范围来交换更多的负值。
int
和unsigned int
是两个不同的整数types。 ( int
也可以被称为signed int
,或者只是被signed
; unsigned int
也可以被称为unsigned
。)
正如名字暗示的那样, int
是一个有符号整数types, unsigned int
是一个无符号整数types。 这意味着int
可以表示负值, unsigned int
只能表示非负值。
C语言对这些types的范围提出了一些要求。 int
的范围必须至less为-32767
.. +32767
,而unsigned int
的范围必须至less为0
.. 65535
。 这意味着两种types都必须至less有16位。 他们在许多系统上是32位,甚至在一些系统上是64位。 由于大多数现代系统使用的二进制补码表示, int
通常具有额外的负值。
也许最重要的区别是有符号和无符号算术的行为。 对于signed int
,溢出具有未定义的行为。 对于unsigned int
,没有溢出; 任何产生超出types范围的值的操作都会回绕,例如UINT_MAX + 1 == 0
。
任何整数types,无论是有符号还是无符号,都会模拟无限math整数集的子范围。 只要你在一个types的范围内的值,一切工作。 当您接近某个types的下限或上限时,会遇到不连续性,并且可能会得到意想不到的结果。 对于带符号的整数types,只有在非常大的负值和正值时才会出现问题,超出了INT_MIN
和INT_MAX
。 对于无符号整数types,非常大的正值和零时出现问题。 这可能是错误的来源。 例如,这是一个无限循环:
for (unsigned int i = 10; i >= 0; i --) [ printf("%u\n", i); }
因为i
总是大于或等于零; 这是无符号types的性质。 (在循环内部,当i
是零时, i--
将其值设置为UINT_MAX
。)