有符号和无符号int之间的区别是什么?
d8tt03nd1#
您可能知道,int在内部以二进制存储,通常int包含32位,但在某些环境中可能包含16或64位(甚至是不同的数字,通常但不一定是2的幂)。但是在这个例子中,让我们看看4位整数。很小,但是对于说明的目的很有用。由于在这样的整数中有四位,所以它可以采用16个值中的一个;16是2的4次方,或者2乘以2乘以2乘以2。这些值是什么?答案取决于这个整数是signed int还是unsigned int。对于unsigned int,该值永远不会为负;没有与该值关联的符号。以下是四位unsigned int的16个可能值:
int
signed int
unsigned int
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 s,当且仅当数字为负数时,最高有效位为1,这就是为什么对于signed int s,这个位被称为“符号位”。
1
plicqrtu2#
通俗地说,无符号整数是一个不能为负的整数,因此它可以假定的正值范围更大;有符号整数是一个可以为负的整数,但它可以假定的负值范围更小。
vawmfj5a3#
int和unsigned int是两种不同的整数类型。(int也可以称为signed int,或者仅称为signed;unsigned int也可以被称为unsigned)。顾名思义,int是一个 signed 整数类型,unsigned int是一个 unsigned 整数类型,这意味着int能够表示负值,而unsigned int只能表示非负值。C语言对这些类型的范围有一些要求。int的范围必须至少为-32767.. +32767,unsigned int的范围必须至少为0.. 65535。这意味着这两种类型都必须至少为16位。在许多系统上它们为32位。或者甚至64位。由于大多数现代系统所使用的二进制补码表示法,int通常具有额外的负值。也许最重要的区别是有符号与无符号算术的行为。对于有符号int,溢出有未定义的行为。对于unsigned int,没有溢出;任何产生类型范围之外的值的操作都会绕回,例如UINT_MAX + 1U == 0U。任何整数类型,无论是有符号的还是无符号的,都是数学整数的无限集合的一个子范围。只要您处理的值在类型的范围内,一切都正常。当您接近类型的下限或上限时,您会遇到不连续性,并且可能会得到意外的结果。对于有符号整数类型,只有非常大的负值和正值才会出现问题。超过INT_MIN和INT_MAX。对于无符号整数类型,在非常大的正值和零时会出现问题。这可能是错误的来源。例如,这是一个无限循环:
signed
unsigned
-32767
+32767
0
65535
UINT_MAX + 1U == 0U
INT_MIN
INT_MAX
for (unsigned int i = 10; i >= 0; i --) { printf("%u\n", i); }
因为i * 总是 * 大于或等于零;这就是无符号类型的本质(在循环中,当i为0时,i--将其值设置为UINT_MAX)。
i
i--
UINT_MAX
bzzcjhmw4#
有时我们事先知道存储在给定整型变量中的值总是正的,例如,当它只用于计数时。在这种情况下,我们可以声明变量为无符号的,如unsigned int num student;。使用这样的声明,允许的整数值范围(对于32位编译器)将从范围-2147483648到+2147483647移动到范围0到4294967295。因此,将整数声明为无符号几乎使其可另外保持的最大可能值的大小加倍。
unsigned int num student;
chhqkbe15#
在实践中,有两个区别:1.打印(例如,在C++中使用cout或在C中使用printf):无符号整数位表示形式被打印函数解释为非负整数。1.订购:排序取决于带符号或不带符号的规范。该代码可以使用排序准则来标识整数:
cout
printf
char a = 0; a--; if (0 < a) printf("unsigned"); else printf("signed");
char在某些编译器中被视为signed,在其他编译器中被视为unsigned。上面的代码使用排序标准确定编译器中考虑哪一个。如果a是无符号的,则在a--之后,它将大于0,但如果它是signed,则它将小于零。但在这两种情况下,a的位表示是相同的,也就是说,在两种情况下a--对位表示做相同的改变。
char
a
a--
5条答案
按热度按时间d8tt03nd1#
您可能知道,
int
在内部以二进制存储,通常int
包含32位,但在某些环境中可能包含16或64位(甚至是不同的数字,通常但不一定是2的幂)。但是在这个例子中,让我们看看4位整数。很小,但是对于说明的目的很有用。
由于在这样的整数中有四位,所以它可以采用16个值中的一个;16是2的4次方,或者2乘以2乘以2乘以2。这些值是什么?答案取决于这个整数是
signed int
还是unsigned int
。对于unsigned int
,该值永远不会为负;没有与该值关联的符号。以下是四位unsigned int
的16个可能值:...以下是四位
signed int
的16个可能值:如你所见,对于
signed int
s,当且仅当数字为负数时,最高有效位为1
,这就是为什么对于signed int
s,这个位被称为“符号位”。plicqrtu2#
通俗地说,无符号整数是一个不能为负的整数,因此它可以假定的正值范围更大;有符号整数是一个可以为负的整数,但它可以假定的负值范围更小。
vawmfj5a3#
int
和unsigned int
是两种不同的整数类型。(int
也可以称为signed int
,或者仅称为signed
;unsigned int
也可以被称为unsigned
)。顾名思义,
int
是一个 signed 整数类型,unsigned int
是一个 unsigned 整数类型,这意味着int
能够表示负值,而unsigned int
只能表示非负值。C语言对这些类型的范围有一些要求。
int
的范围必须至少为-32767
..+32767
,unsigned int
的范围必须至少为0
..65535
。这意味着这两种类型都必须至少为16位。在许多系统上它们为32位。或者甚至64位。由于大多数现代系统所使用的二进制补码表示法,int
通常具有额外的负值。也许最重要的区别是有符号与无符号算术的行为。对于有符号
int
,溢出有未定义的行为。对于unsigned int
,没有溢出;任何产生类型范围之外的值的操作都会绕回,例如UINT_MAX + 1U == 0U
。任何整数类型,无论是有符号的还是无符号的,都是数学整数的无限集合的一个子范围。只要您处理的值在类型的范围内,一切都正常。当您接近类型的下限或上限时,您会遇到不连续性,并且可能会得到意外的结果。对于有符号整数类型,只有非常大的负值和正值才会出现问题。超过
INT_MIN
和INT_MAX
。对于无符号整数类型,在非常大的正值和零时会出现问题。这可能是错误的来源。例如,这是一个无限循环:因为
i
* 总是 * 大于或等于零;这就是无符号类型的本质(在循环中,当i
为0时,i--
将其值设置为UINT_MAX
)。bzzcjhmw4#
有时我们事先知道存储在给定整型变量中的值总是正的,例如,当它只用于计数时。在这种情况下,我们可以声明变量为无符号的,如
unsigned int num student;
。使用这样的声明,允许的整数值范围(对于32位编译器)将从范围-2147483648到+2147483647移动到范围0到4294967295。因此,将整数声明为无符号几乎使其可另外保持的最大可能值的大小加倍。chhqkbe15#
在实践中,有两个区别:
1.打印(例如,在C++中使用
cout
或在C中使用printf
):无符号整数位表示形式被打印函数解释为非负整数。1.订购:排序取决于带符号或不带符号的规范。
该代码可以使用排序准则来标识整数:
char
在某些编译器中被视为signed
,在其他编译器中被视为unsigned
。上面的代码使用排序标准确定编译器中考虑哪一个。如果a
是无符号的,则在a--
之后,它将大于0
,但如果它是signed
,则它将小于零。但在这两种情况下,a
的位表示是相同的,也就是说,在两种情况下a--
对位表示做相同的改变。