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是一个整数,可以是负数,但是可以使用一个较低的正数范围来交换更多的负值。

intunsigned 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_MININT_MAX 。 对于无符号整数types,非常大的正值和零时出现问题。 这可能是错误的来源。 例如,这是一个无限循环:

 for (unsigned int i = 10; i >= 0; i --) [ printf("%u\n", i); } 

因为i 总是大于或等于零; 这是无符号types的性质。 (在循环内部,当i是零时, i--将其值设置为UINT_MAX 。)

Interesting Posts