有符号和无符号int有什么区别

问题描述 投票:72回答:6

signed和unsigned int有什么区别?

c unsigned-integer signed-integer
6个回答
91
投票

您可能已经知道,int在内部以二进制存储。通常,int包含32位,但是在某些环境中可能包含16位或64位(或者甚至是不同的数字,通常但不一定是2的幂)。

但是对于这个示例,让我们看一下4位整数。很小,但对说明有用。

由于这样的整数有4位,因此可以假定16个值之一; 16是2到4的幂,或者2乘2乘2乘2。这些值是多少?答案取决于此整数是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,此位被称为“符号位”。


15
投票

intunsigned int是两个不同的整数类型。 (int也可以称为signed int,或仅称为signedunsigned int也可以称为unsigned。)

顾名思义,intsigned整数类型,unsigned intunsigned整数类型。这意味着int可以表示负值,unsigned int只能表示非负值。

C语言对这些类型的范围提出了一些要求。 int的范围必须至少为-32767 .. +32767,并且unsigned int的范围必须至少为0 .. 65535。这意味着两种类型都必须至少为16位。在许多系统上,它们是32位,在某些系统上甚至是64位。 int通常由于大多数现代系统使用的二进制补码表示而具有额外的负值。

也许最重要的区别是有符号与无符号算术的行为。对于带符号的int,溢出具有未定义的行为。对于unsigned int,没有溢出;任何产生超出类型范围的值的操作都会回绕,例如UINT_MAX + 1U == 0U

任何有符号或无符号的整数类型,都可以对无限整数数学整数的子范围进行建模。只要您使用类型范围内的值,一切都将起作用。当您接近类型的下限或上限时,会遇到不连续的情况,并且您会得到意想不到的结果。对于有符号整数类型,仅在非常大的负值和正值(超过INT_MININT_MAX)时才会出现问题。对于无符号整数类型,非常大的正值并且为零会出现问题。这可能是错误的来源。例如,这是一个无限循环:

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

因为i始终等于或大于零;这就是无符号类型的本质。 (在循环内部,当i为零时,i--将其值设置为UINT_MAX。)


10
投票
有时我们预先知道,存储在给定整数变量中的值将始终为正,例如,仅用于对事物进行计数时。在这种情况下,我们可以将变量声明为无符号的,例如unsigned int num student;。使用这样的声明,允许的整数值范围(对于32位编译器)将从-2147483648到+2147483647范围从0到4294967295范围。因此,将整数声明为unsigned几乎使最大可能的大小加倍。它可以保留的值。

9
投票
用外行术语来说,无符号整数是一个不能为负的整数,因此可以假定更大范围的正值。有符号的整数是一个可以为负的整数,但正整数范围较小,以换取可以假定的更多负值。

0
投票
实际上,有两个区别:

0
投票
这里有两个链接,当我尝试了解计算机中有符号和无符号整数的行为时,我发现很有帮助:
© www.soinside.com 2019 - 2024. All rights reserved.