【问题标题】:Twos Complement ~0 signed二进制补码 ~0 已签名
【发布时间】:2017-01-29 03:50:37
【问题描述】:

我是新来的,但我只是想知道如果在二进制补码系统中,~0 会是有符号整数。

它是-1,因为 0 的翻转是 1,但如果它已签名,答案将是 -1?或者答案只是 1 并且仅仅因为我正在使用带符号的数字并不意味着它会是 -1?

【问题讨论】:

标签: c binary twos-complement negation


【解决方案1】:

0 是一个有符号的int(如果你希望它是无符号的,你可以写成0U),因此~0 也是一个有符号的int

如果您的机器使用 2 的补码表示,那么它的值将是 -1。绝大多数机器——可能是你在职业生涯中见过的所有机器——都是 2 的补码,但从技术上讲,~0 如果你在使用 1 的补码表示的机器上使用它,可能会调用未定义的行为有符号整数,也禁止负零。

即使这可能无关紧要,养成只使用无符号整数类型和位运算符的习惯也是一个好主意。

请记住,按位运算符对其操作数执行“整数提升”,这意味着有符号和无符号 shortchar 会自动提升为 int -- 不是 @987654330 @(除非碰巧shortint 的宽度相同)——因此可能需要显式转换为unsigned

【讨论】:

    【解决方案2】:

    ~0 不是零的二进制补码。它是 0 的位反转,与一个的补码相同。

    如果你想要 C 中的二进制补码,你需要-0(注意减号) 而且,-0 将只是 0。

    Proof (in eight bit)
    zero             - 0b00000000
    one'e complement - 0b11111111
    Add one          - 0b00000001  (ignoring overflow)
                       -----------
    Two's complement - 0b00000000
    

    【讨论】:

    • 我不认为 OP 说~00 的补码。 OP 正在询问 ~0 在二进制补码系统中的十进制值。
    • 我也回答了这个问题。如果您将二进制补码设置为-0,那么它实际上是 0 会变得更加清晰。
    • 那你是说~00 一样吗?问题不在于-0(负零)的值是多少,而是~0(按位不为零)的值是多少。
    猜你喜欢
    • 2012-11-23
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    相关资源
    最近更新 更多