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

有帮助吗?

解决方案

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

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

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

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

签名号码表示上的维基百科页面解释了位级表示的差异,以及整数(计算机科学)页面提供了每个有符号/无符号整数的范围表类型。

其他提示

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

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

       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或正数。

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

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

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

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

这只是我的两分钱。

我希望这会有所帮助。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top