【问题标题】:What is the difference between signed and unsigned variables?有符号变量和无符号变量有什么区别?
【发布时间】:2010-10-11 21:36:27
【问题描述】:

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

【问题讨论】:

    标签: language-agnostic variables unsigned


    【解决方案1】:

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

    无符号变量,例如无符号整数,只允许您用正数和零表示数字

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

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

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

    【讨论】:

    • 正数大于零。至少在 C 中,有符号数可能使用符号位而不是补码表示,因此由于重复的 +/- 零,因此与无符号数的范围不同。如果你说一个 int 是 16 位的,就说平台;大多数现代系统都是 32 位或 64 位的。
    【解决方案2】:

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

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

          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

    【讨论】:

    • 非常感谢!我真的很困惑为什么有符号字节是 -128 到 127 而不是 -127 到 127。这个答案需要更多的赞成票!
    【解决方案3】:

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

    更多:Unsigned and Signed Integers

    【讨论】:

    • 谢谢,经过 2 分钟的谷歌搜索,这是我最喜欢为我澄清的答案
    • 这并不完全正确。第一位不是2的补码中的符号位,但它显示符号!
    【解决方案4】:

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

    这种能力称为“符号”或“签名位”。

    副作用是,如果没有签名位,它们就会多一个位来表示数字,使其可以表示的最大数字加倍。

    【讨论】:

      【解决方案5】:

      有符号变量可以为 0、正数或负数。

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

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

        • 无符号也可以为0。
        【解决方案7】:

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

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

        这只是我的两分钱。

        我希望这会有所帮助。

        【讨论】:

          【解决方案8】:

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

          【讨论】:

            猜你喜欢
            • 2011-04-05
            • 1970-01-01
            • 2014-09-16
            • 1970-01-01
            • 1970-01-01
            • 2017-07-25
            • 2012-07-24
            • 2012-02-25
            • 1970-01-01
            相关资源
            最近更新 更多