有符号和无符号值是什么意思?

signed在C中意味着什么? 我有这张表显示:

在此处输入图像描述

这表示signed char 128+127128也是一个正整数,那么这怎么可能是+128+127 ? 或者128+127有不同的含义? 我指的是Apress Beginning C这本书。

有符号整数可以表示负数; 没有签名不能。

有符号整数如果溢出则具有未定义的行为,而无符号整数则使用模数进行回绕。

请注意,该表不正确。 首先,它缺少-符号(例如-128到+127)。 其次,该标准不保证这些类型必须在这些范围内。

默认情况下,C中的数值是有符号的,这意味着它们可以是负数和正数。 另一方面,无符号值不允许使用负数。

因为它只是关于内存,所以最后所有数值都以二进制forms存储。 32位无符号整数可以包含从所有二进制0到所有二进制1的值。 当涉及到32位有符号整数时,它意味着它的一个位(最重要的)是一个标志,它将值标记为正或负。 所以,它是解释问题,它告诉价值已经签署。

正符号值的存储方式与无符号值的存储方式相同,但使用二进制补码方法存储负数。

如果要以二进制forms写入负值,则首先写入正数,然后反转所有位,最后加1。当将二进制补码中的负值添加到相同幅度的正数时,结果将为0。

在下面的示例中,我们可以处理8位数字,因为检查起来很简单:

 positive 95: 01011111 negative 95: 10100000 + 1 = 10100001 [positive 161] 0: 01011111 + 10100001 = 100000000 ^ |_______ as we're dealing with 8bit numbers, the 8 bits which means results in 0 

该表缺少这些缺点。 签名字符的范围是-128到+127; 同样适用于桌面上的其他类型。

签名号码是那些附加+或 – 的号码。 例如+2和-6是带符号的数字。 签名数字可以存储正数和负数,这就是为什么它们具有更大的范围。 即-32768至32767

无符号数字只是数字,没有符号。 他们总是积极的。 它们的范围是0到65535。

希望能帮助到你

这是书中的一个错字; signed char从-128到127。

使用二进制补码表示存储有符号整数,其中第一位用于指示符号。

在C中,字符只是8位整数。 这意味着它们可以从 – (2 ^ 7)变为2 ^ 7 – 1.这是因为我们使用数字的最后7位和符号的第一位。 0表示正数,1表示负数(以二进制补码表示)。

  • 最大的正7位数是(01111111)b = 2 ^ 7 – 1 = 127。
  • 最小的负7位数是(11111111)b = -128
    (因为11111111是10000000 = 2 ^ 7 = 128的二进制补码)。

无符号字符没有符号,因此可以使用所有8位。 从(00000000)b = 0到(11111111)b = 255。

签名通常表示数字前面有一个+或 – 符号。 这意味着unsigned int,unsigned short等不能为负。

有符号整数可以包含负值和正值。 无符号整数只能有正值。

对于使用最常用的二进制补码的有符号整数,范围是(取决于整数的位宽):

char s -> range -128-127

无符号字符的范围:

unsigned char s -> range 0-255

首先,你的表是错的……缺少负数。 引用char类型….你可以表示所有256种可能性,因为char有一个字节意味着2 ^ 8。 所以现在你有两种方法可以设置你的范围。 从-128到+128或0到255.第一个是签名字符 ,第二个是unsigned char 。 如果使用整数,请注意您正在使用的操作系统类型。 16位,32位或64位。 Int(16位,32位,64位)。 char总是只有8位值。

所有整数数据类型都是有符号数据类型,即它们具有可以是正数或负数的值。 无符号数始终为非负数。

没人提到这一点,但表中的int范围是错误的:它是

 -2^(31) to 2^(31)-1 

 -2,147,483,648 to 2,147,483,647