C语言 有符号和无符号int之间的区别是什么

uyto3xhc  于 2023-03-01  发布在  其他
关注(0)|答案(5)|浏览(402)

有符号和无符号int之间的区别是什么?

d8tt03nd

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个可能值:

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,这个位被称为“符号位”。

plicqrtu

plicqrtu2#

通俗地说,无符号整数是一个不能为负的整数,因此它可以假定的正值范围更大;有符号整数是一个可以为负的整数,但它可以假定的负值范围更小。

vawmfj5a

vawmfj5a3#

intunsigned int是两种不同的整数类型。(int也可以称为signed int,或者仅称为signed;unsigned int也可以被称为unsigned)。
顾名思义,int是一个 signed 整数类型,unsigned int是一个 unsigned 整数类型,这意味着int能够表示负值,而unsigned int只能表示非负值。
C语言对这些类型的范围有一些要求。int的范围必须至少为-32767.. +32767unsigned 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为0时,i--将其值设置为UINT_MAX)。

bzzcjhmw

bzzcjhmw4#

有时我们事先知道存储在给定整型变量中的值总是正的,例如,当它只用于计数时。在这种情况下,我们可以声明变量为无符号的,如unsigned int num student;。使用这样的声明,允许的整数值范围(对于32位编译器)将从范围-2147483648到+2147483647移动到范围0到4294967295。因此,将整数声明为无符号几乎使其可另外保持的最大可能值的大小加倍。

chhqkbe1

chhqkbe15#

在实践中,有两个区别:
1.打印(例如,在C++中使用cout或在C中使用printf):无符号整数位表示形式被打印函数解释为非负整数。
1.订购:排序取决于带符号或不带符号的规范。
该代码可以使用排序准则来标识整数:

char a = 0;
a--;
if (0 < a)
    printf("unsigned");
else
    printf("signed");

char在某些编译器中被视为signed,在其他编译器中被视为unsigned。上面的代码使用排序标准确定编译器中考虑哪一个。如果a是无符号的,则在a--之后,它将大于0,但如果它是signed,则它将小于零。但在这两种情况下,a的位表示是相同的,也就是说,在两种情况下a--对位表示做相同的改变。

相关问题