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

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

还有其他区别吗?


当前回答

另一个区别是在不同大小的整数之间进行转换时。

例如,如果你从字节流中提取一个整数(简单来说就是16位),使用无符号值,你可以这样做:

i = ((int) b[j]) << 8 | b[j+1]

(可能应该强制转换第二个字节,但我猜编译器会做正确的事情)

对于有符号的值,你必须担心符号扩展,并做:

i = (((int) b[i]) & 0xFF) << 8 | ((int) b[i+1]) & 0xFF

其他回答

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

除了第二点,其他都是正确的。有符号整型有许多不同的表示法,有些实现使用第一种,有些使用最后一种,还有一些使用完全不同的表示法。这取决于你所使用的平台。

另一个区别是在不同大小的整数之间进行转换时。

例如,如果你从字节流中提取一个整数(简单来说就是16位),使用无符号值,你可以这样做:

i = ((int) b[j]) << 8 | b[j+1]

(可能应该强制转换第二个字节,但我猜编译器会做正确的事情)

对于有符号的值,你必须担心符号扩展,并做:

i = (((int) b[i]) & 0xFF) << 8 | ((int) b[i+1]) & 0xFF

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

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

Yes.

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

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

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

Yes.