有符号和无符号变量之间有什么区别?
-
05-07-2019 - |
题
我在C和C ++的上下文中看到过这些,但有符号和无符号变量之间有什么区别?
其他提示
虽然通常称为“符号位”,但我们通常使用的二进制值没有真正的符号位。
大多数计算机使用二进制补码算法。通过取一个补码(翻转所有位)并添加一个来创建负数:
       5(十进制) - > 00000101(二进制)
       1的补码:11111010
       add 1:11111011,这是十六进制的'FB'
点击
点击
这就是有符号字节保存-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(十进制) - > 00000101(二进制)
       -5(decimal) - > 10000101(二进制)
在这种情况下有趣的是我们有零和负零:
       0(十进制) - > 00000000(二进制)
       -0(decimal) - > 10000000(二进制)
点击
点击
我们没有-0和二进制补码;什么是-0是-128(或更一般,比最大正值多一个)。虽然我们做一个人的补充;所有1位都是负0。
在数学上,-0等于0.我依稀记得一台计算机,其中-0< 0,但我现在找不到任何参考。
有符号变量使用一位来标记它们是正还是负。无符号变量没有这个位,因此它们可以在同一空间中存储更大的数字,但只能存储非负数,例如0和更高。
更多信息:未签名和签名整数
无符号变量只能是正数,因为它们无法表明它们是负数。
此功能称为“签名”或“签名位”。
副作用是没有签名位,它们还有一个位可以用来表示数字,它可以代表它的最大数量加倍。
签名变量可以是0,正数或负数。
无符号变量可以是0或正数。
有时使用无符号变量,因为可以使用更多位来表示实际值。给你更大的范围。另外,您可以确保不会将负值传递给您的函数。
无符号变量是内部表示的变量,没有数学符号(加号或减号)只能存储“零”或正值。假设无符号变量的大小为 n位,则它可以表示2 ^ n(2次幂n)值 - 0到(2 ^ n -1)。另一方面,有符号变量“丢失”一位用于表示符号,因此它可以存储来自 - (2 ^(n-1)-1)到(2 ^(n-1))的值,包括零。因此,签名变量可以存储正值,负值和零。
<强> P.S:强>结果
在内部,数学符号可以用一个补码形式,二个补码形式或符号位表示(例如:0 - > +,1-> - )
所有这些方法都有效地将n位(2 ^ n)中可表示值的范围分为正,负和零三个部分。
这只是我的两分钱。
我希望这会有所帮助。
这可能不是确切的定义,但我会举个例子: 如果你要从系统时间创建一个随机数,那么使用无符号变量是有益的,因为随机数的范围很大,因为有符号数给出正数和负数。由于系统时间不能为负,我们使用无符号变量(只有正数),我们有更广泛的随机数。