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

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

还有其他区别吗?


当前回答

除此之外,在C语言中,你不能溢出一个无符号整数;行为被定义为模算术。您可以溢出一个有符号整数,并且在理论上(尽管在当前主流系统上没有实践),溢出可能会触发一个错误(可能类似于除零错误)。

其他回答

我将在x86上讨论硬件层面的差异。除非您正在编写编译器或使用汇编语言,否则这几乎无关紧要。但很高兴知道。

首先,x86原生支持这两个数字的有符号数的补表示。您可以使用其他表示,但这将需要更多的指令,通常是浪费处理器时间。

我所说的“原生支持”是什么意思?我的意思是,有一组指令用于无符号数,另一组用于有符号数。无符号数可以与有符号数位于相同的寄存器中,实际上,您可以混合有符号和无符号指令,而不用担心处理器。由编译器(或汇编程序员)来跟踪数字是否带符号,并使用适当的指令。

首先,2的补数具有加减法与无符号数相同的性质。这些数字是正还是负没有区别。(所以你只要继续做加法和减法就可以了,不用担心。)

当进行比较时,差异开始显现出来。X86有一种简单的区分方法:上面/下面表示无符号比较,而大于/小于表示有符号比较。(例如,JAE的意思是“高于或等于就跳”,没有符号。)

还有两组乘除指令用于处理有符号整数和无符号整数。

最后:如果你想检查溢出,你可以对有符号数和无符号数做不同的检查。

为了完整起见,这里只提几点:

this answer is discussing only integer representations. There may be other answers for floating point; the representation of a negative number can vary. The most common (by far - it's nearly universal today) in use today is two's complement. Other representations include one's complement (quite rare) and signed magnitude (vanishingly rare - probably only used on museum pieces) which is simply using the high bit as a sign indicator with the remain bits representing the absolute value of the number. When using two's complement, the variable can represent a larger range (by one) of negative numbers than positive numbers. This is because zero is included in the 'positive' numbers (since the sign bit is not set for zero), but not the negative numbers. This means that the absolute value of the smallest negative number cannot be represented. when using one's complement or signed magnitude you can have zero represented as either a positive or negative number (which is one of a couple of reasons these representations aren't typically used).

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

他只问了签过名和没签过名的。不知道为什么人们要在里面加额外的东西。让我来告诉你答案。

Unsigned:它只包含非负值,即0到255。 Signed:由正负值组成,但格式不同,如 0 ~ +127 -1 ~ -128

这个解释是关于8位数字系统的。

一般来说,这是正确的。在不知道你为什么要寻找差异的情况下,我想不出有符号和无符号之间的任何其他区别。