我在C和C ++的上下文中看到过这些,但有符号和无符号变量之间有什么区别?
答案 0 :(得分:116)
签名变量,例如有符号整数,允许您表示正数和负数范围内的数字。
无符号变量,例如无符号整数,只允许您在正数中表示数字。
相同类型的无符号和有符号变量(例如int
和byte
)都具有相同的范围(范围分别为65,536和256个数字),但无符号可表示比相应的签名变量更大的数量。
例如,unsigned byte
可以表示从0
到255
的值,而signed byte
可以表示-128
到127
。
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和更高。
答案 3 :(得分:3)
无符号变量只能是正数,因为它们无法表明它们是负数。
此功能称为“签名”或“签名位”。
副作用是没有签名位,它们还有一个位可以用来表示数字,它可以代表它的最大数量加倍。
答案 4 :(得分:3)
签名变量可以是0,正数或负数。
无符号变量可以是0或正数。
有时使用无符号变量,因为可以使用更多位来表示实际值。给你更大的范围。另外,您可以确保不会将负值传递给您的函数。
答案 5 :(得分:2)
答案 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)
这可能不是确切的定义,但我会举个例子: 如果你要从系统时间创建一个随机数,那么使用无符号变量是有益的,因为随机数的范围很大,因为有符号数给出正数和负数。由于系统时间不能为负,我们使用无符号变量(只有正数),我们有更广泛的随机数。