22

在 C 中是什么signed意思?我有这张表要显示:

在此处输入图像描述

signed char 128+127. 128也是一个正整数,那么这怎么可能+128+127?或者做128+127有不同的含义?我指的是 Apress开始 C书。

4

9 回答 9

39

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

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

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

于 2012-11-25T17:53:58.713 回答
8

默认情况下,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
于 2012-11-25T18:48:31.407 回答
4

该表缺少缺点。有符号字符的范围是-128 到+127;同样适用于桌子上的其他类型。

于 2012-11-25T17:53:09.293 回答
4

这是书中的一个错字;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。

于 2012-11-25T18:49:09.383 回答
2

带符号的数字是带有 + 或 - 的数字。例如 +2 和 -6 是有符号数。有符号数可以存储正数和负数,这就是它们具有更大范围的原因。即-32768到32767

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

希望能帮助到你

于 2012-11-25T17:55:38.947 回答
1

有符号通常意味着数字前面有一个 + 或 - 符号。这意味着 unsigned int、unsigned shorts 等不能为负数。

于 2012-11-25T17:53:20.847 回答
1

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

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

IE,

-2,147,483,648 to 2,147,483,647
于 2018-04-07T11:47:53.830 回答
0

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

于 2012-11-25T18:03:16.817 回答
0

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

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

char s -> range -128-127

unsigned char 具有以下范围:

unsigned char s -> range 0-255

于 2012-11-25T17:59:01.327 回答