有符号和无符号变量之间有什么区别?

时间:2009-03-07 04:11:30

标签: language-agnostic variables unsigned

我在C和C ++的上下文中看到过这些,但有符号和无符号变量之间有什么区别?

8 个答案:

答案 0 :(得分:116)

签名变量,例如有符号整数,允许您表示正数和负数范围内的数字

无符号变量,例如无符号整数,只允许您在正数中表示数字。

相同类型的无符号和有符号变量(例如intbyte)都具有相同的范围(范围分别为65,536和256个数字),但无符号可表示比相应的签名变量更大的数量。

例如,unsigned byte可以表示从0255的值,而signed byte可以表示-128127

Signed number representations上的维基百科页面解释了位级表示的差异,Integer (computer science)页面提供了每个有符号/无符号整数类型的范围表。

答案 1 :(得分:41)

虽然通常称为“符号位”,但我们通常使用的二进制值没有真正的符号位。

大多数计算机使用二进制补码算法。通过取一个补码(翻转所有位)并添加一个来创建负数:

5 (decimal) -> 00000101 (binary)
1's complement: 11111010
add 1: 11111011 which is 'FB' in hex


这就是有符号字节保存-128到+127而不是-127到+127的值的原因:

1 0 0 0 0 0 0 0 = -128
1 0 0 0 0 0 0 1 = -127
- - -
1 1 1 1 1 1 1 0 = -2
1 1 1 1 1 1 1 1 = -1
0 0 0 0 0 0 0 0 = 0
0 0 0 0 0 0 0 1 = 1
0 0 0 0 0 0 1 0 = 2
- - -
0 1 1 1 1 1 1 0 = 126
0 1 1 1 1 1 1 1 = 127
(加1到127给:) 我们在此图表顶部看到的1 0 0 0 0 0 0 0是-128

如果我们有一个正确的符号位,则值范围将是相同的(例如,-127到+127),因为为该符号保留了一个位。如果最重要的位是符号位,我们有:

5 (decimal) -> 00000101 (binary)
-5 (decimal) -> 10000101 (binary)

在这种情况下有趣的是我们既有零也有负零:
0 (decimal) -> 00000000 (binary)
-0 (decimal) -> 10000000 (binary)


我们没有-0和二进制补码;什么是-0是-128(或更一般,比最大正值多一个)。虽然我们做一个人的补充;所有1位都是负0。

在数学上,-0等于0.我依稀记得一台计算机,其中-0< 0,但我现在找不到任何参考。

答案 2 :(得分:18)

有符号变量使用一位来标记它们是正还是负。无符号变量没有这个位,因此它们可以在同一空间中存储更大的数字,但只能存储非负数,例如0和更高。

更多信息:Unsigned and Signed Integers

答案 3 :(得分:3)

无符号变量只能是正数,因为它们无法表明它们是负数。

此功能称为“签名”或“签名位”。

副作用是没有签名位,它们还有一个位可以用来表示数字,它可以代表它的最大数量加倍。

答案 4 :(得分:3)

签名变量可以是0,正数或负数。

无符号变量可以是0或正数。

有时使用无符号变量,因为可以使用更多位来表示实际值。给你更大的范围。另外,您可以确保不会将负值传递给您的函数。

答案 5 :(得分:2)

当你的值必须是正数时使用unsigned,这里没有负值, 如果签名为int范围-32768到+32767 如果unsigned为int范围0到65535

答案 6 :(得分:0)

无符号变量是内部表示的变量,没有数学符号(加号或减号)只能存储“零”或正值。让我们说无符号变量的大小是 n位,那么它可以表示2 ^ n(2次幂n)值 - 0到(2 ^ n -1)。另一方面,有符号变量“丢失”一位用于表示符号,因此它可以存储来自 - (2 ^(n-1)-1)到(2 ^(n-1))的值,包括零。因此,签名变量可以存储正值,负值和零

<强> P.S:
在内部,数学符号可以用一个补码形式,二进制补码形式或符号位表示(例如:0 - > +,1-> - )
所有这些方法都有效地将n位(2 ^ n)中可表示值的范围分为正,负和零三个部分。

这只是我的两分钱。

我希望这会有所帮助。

答案 7 :(得分:-1)

这可能不是确切的定义,但我会举个例子: 如果你要从系统时间创建一个随机数,那么使用无符号变量是有益的,因为随机数的范围很大,因为有符号数给出正数和负数。由于系统时间不能为负,我们使用无符号变量(只有正数),我们有更广泛的随机数。