有符号整数和无符号整数之间的区别是:

Unsigned值可以是一个较大的正数,而不能是负数。 Unsigned版本使用前导位作为值的一部分,而signed版本使用最左边的位来识别数字是正还是负。 有符号整数可以同时包含正数和负数。

还有其他区别吗?


当前回答

Unsigned值可以是一个较大的正数,而不能是负数。

Yes.

Unsigned版本使用前导位作为值的一部分,而signed版本使用最左边的位来识别数字是正还是负。

有不同的表示有符号整数的方法。最容易想象的是使用最左边的位作为标志(符号和幅度),但更常见的是2的补位。这两种方法在大多数现代微处理器中都有使用——浮点数使用符号和幅度,而整数算术使用2的补数。

有符号整数可以同时包含正数和负数。

Yes.

其他回答

是的,无符号整数可以存储大的值。 不,有不同的方式来表示正数和负数。 是的,有符号整数可以包含正数和负数。

在嵌入式系统上编程时,必须使用无符号整数。在循环中,当不需要有符号整数时,使用无符号整数将节省设计此类系统所需的安全。

Unsigned值可以是一个较大的正数,而不能是负数。

Yes.

Unsigned版本使用前导位作为值的一部分,而signed版本使用最左边的位来识别数字是正还是负。

有不同的表示有符号整数的方法。最容易想象的是使用最左边的位作为标志(符号和幅度),但更常见的是2的补位。这两种方法在大多数现代微处理器中都有使用——浮点数使用符号和幅度,而整数算术使用2的补数。

有符号整数可以同时包含正数和负数。

Yes.

无符号整数比有符号整数更容易让您陷入特定的陷阱。陷阱来自于这样一个事实:虽然上面的1和3是正确的,但这两种类型的整数都可以被赋值到它可以“容纳”的范围之外,并且它将被无声地转换。

unsigned int ui = -1;
signed int si = -1;

if (ui < 0) {
    printf("unsigned < 0\n");
}
if (si < 0) {
    printf("signed < 0\n");
}
if (ui == si) {
    printf("%d == %d\n", ui, si);
    printf("%ud == %ud\n", ui, si);
}

运行此命令时,您将得到以下输出,尽管这两个值都赋值为-1,且声明方式不同。

signed < 0
-1 == -1
4294967295d == 4294967295d

(回答第二个问题)通过只使用符号位(而不是2的补码),你可以得到-0。不太漂亮。