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

22

signed 在 C 语言中是什么意思?我有这个表格可以展示:

enter image description here

这段文字说的是 signed char 可以存储从 +128+127 的数值。但是 128 也是一个正整数,那么为什么会变成 +128+127 呢?或者说 128+127 有不同的含义吗?这个问题出现在 Apress Beginning C 这本书中。

4
表格中只是缺少减号。每个数值范围的第一个数字前应该有一个减号。 - David Schwartz
1
谢谢大家,给在座的每个人点赞,我确信书上有些问题。 - Hello World
10个回答

42

有符号整数可以表示负数;无符号整数不能。

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

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


9
默认情况下,C语言中的数字值是有符号的,这意味着它们既可以是负数也可以是正数。另一方面,无符号值不允许出现负数。
由于它们只涉及内存,最终所有数字值都以二进制形式存储。32位无符号整数可以包含从所有二进制0到所有二进制1的值。当涉及到32位有符号整数时,这意味着其中一位(最高有效位)是一个标志,用于标记该值为正或负。因此,这是一个解释问题,告诉值是有符号的。
正有符号值与无符号值的存储方式相同,但是使用“二进制补码”方法存储负数。
如果要在二进制中编写负值,首先编写正数,接下来反转所有位并加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

4

这个表格缺少负数。signed char 的范围是-128到+127;其他类型的范围也是如此。


那就是我感到困惑的地方,我指的是 Apress 出版社的书。 - Hello World

4
这本书中有一处打字错误;signed char 的取值范围是从-128到127。
使用二进制补码表示法存储带符号整数,其中第一位表示符号。
在C语言中,char类型只是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的二进制补码)。
无符号char没有符号,因此可以使用所有8位。 取值范围从(00000000)b = 0到(11111111)b = 255。

2

有符号数是指在数字前面加上+或-的数字。例如,+2和-6都是有符号数。有符号数可以存储正数和负数,因此它们具有更大的范围,即-32768到32767。

无符号数是指没有符号的数字。它们总是正数,其范围为0到65535。

希望对您有所帮助。


2
带符号数字可以存储正数和负数,因此它们具有更大的范围。即-32768到32767。不,它们没有更大的范围。它们有一个不同的范围。这就是为什么您的无符号短整型可以一直达到65535的原因。 - Lightness Races in Orbit

1
没有人提到这一点,但表格中int的范围是错误的:它是
-2^(31) to 2^(31)-1

i.e.,

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

1

有符号通常意味着数字前面带有+或-符号。这意味着无符号整数、无符号短整型等不能为负数。


什么是无符号的双精度/浮点数? - Lightness Races in Orbit
这比那要复杂一些。首先,不存在无符号的双精度/浮点数。 - Lightness Races in Orbit

0

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

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

char s -> 范围 -128-127

其中无符号字符的范围为:

unsigned char s -> 范围 0-255


0

首先,您的表格有误……缺少负数。关于char类型……您可以用char表示所有256种可能性,因为char有一个字节,意味着2^8。所以现在您有两个选择来设置您的范围。要么从-128到+128,要么从0到255。第一个是带符号的char,第二个是无符号的char。如果您使用整数,请注意您正在使用什么操作系统。16位、32位还是64位。int(16位、32位、64位)。char始终只有8位值。


0

这意味着你的值前面可能会有一个符号(例如 +12345 或 -12345)


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community
像字面上的 +- 一样吗?通常打印正数时前面不会有 + - General Grievance

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接