有符号和无符号variables有什么区别?
我已经看到了这些在C和C ++的上下文中提到的,但是有符号和无符号variables有什么区别呢?
有符号的variables (如带符号整数)将允许您在正范围和负范围内表示数字 。
无符号variables (如无符号整数)将只允许用正数表示数字 。
相同types的无符号和有符号variables(如int
和byte
)都具有相同的范围(分别为65,536和256个数字范围),但是无符号可以表示比相应的有符号variables更大的数量级 。
例如, unsigned byte
可以表示0
到255
值,而有signed byte
可以表示-128
到127
。
有符号数字表示上的维基百科页面解释了位级别表示的差异, 整数(计算机科学)页面为每个有符号/无符号整数types提供了一个范围表。
虽然通常被称为“符号位”,但我们通常使用的二进制值没有真正的符号位。
大多数计算机使用二进制补码algorithm。 负数是通过取一个补码(翻转所有位)并添加一个来创build的:
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是-128(或者更一般,比最大正值多一个)。 尽pipe我们做了补充。 所有1位是负的0。
在math上,-0等于0.我隐约记得一台电脑,其中-0 <0,但我现在找不到任何参考。
有符号的variables用一位来标记它们是正还是负。 无符号variables没有这个位,因此它们可以在相同的空间中存储较大的数字,但只能存储非负数,例如0和更高的数字。
更多信息: 无符号和有符号整数
无符号variables只能是正数,因为它们缺乏表示它们是否定的能力。
这种能力被称为“符号”或“签名位”。
一个副作用是没有签名位,他们有一个可以用来表示数字的位,它可以表示的最大数量加倍。
有符号的variables可以是0,正数或负数。
无符号variables可以是0或正数。
有时会使用无符号variables,因为可以使用更多位来表示实际值。 给你更大的范围。 你也可以确保负值不会传递给你的函数。
当ur值必须为正数时使用无符号,如果为int,则为负值,如果为int,则为-32768至+32767如果为unsigned,则为int范围0至65535
无符号variables是内部表示而没有math符号的variables (加号或减号) 只能存储“零”或正值 。 假设无符号variables的大小为n位 ,那么它可以表示2 ^ n(2个功率n)值 – 0到(2 ^ n -1)。 另一方面,带符号的variables'丢失'一位表示符号,所以它可以存储从(2 ^(n-1)-1)到(2 ^(n-1))包括零的值。 因此,一个有符号的variables可以存储正值,负值和零 。
PS:
在内部,math符号可以以补码forms,二进制补码forms或符号位表示(例如:0→1→1→)
所有这些方法有效地将n比特(2 ^ n)中的可表示值的范围划分为正,负和零三部分。
这只是我的两分钱。
我希望这有帮助。
这可能不是确切的定义,但我会给你一个例子:如果你要创build一个随机数从系统时间,这里使用无符号variables是有益的,因为随机数有很大的范围作为有符号数正面和负面的数字。 由于系统时间不能为负,我们使用无符号variables(只有正数),我们有更广泛的随机数。