【问题标题】:Bitwise NOT with boolean variable [duplicate]按位 NOT 与布尔变量 [重复]
【发布时间】:2016-11-01 22:16:32
【问题描述】:

我是位运算符和布尔类型的初学者。我可能错了,但我认为 bool 类型以 1 位表示,并且可以从 {0, 1} 中获取值。所以,我用这样的变量尝试了 NOT (~) 运算符,结果对我来说很奇怪。 例如。对于

    bool x = 0;
    cout << (~x);

我得到-1。 (我期望1)你能告诉我我错在哪里,为什么只有!运算符是否反转值(从 0 到 1 和从 1 到 0)?

【问题讨论】:

    标签: c++ boolean bit-manipulation operator-keyword


    【解决方案1】:

    大多数处理器没有 1 位宽的通用寄存器,因此当您使用布尔值时,它会占用该平台上的任何默认寄存器大小(即,如今大多数 Intel 和 ARM 计算机上为 64 位,但可能是 32 位在某些嵌入式系统上)。当你否定一些全为零的东西时,你会得到全 1。在twos complement 中,这将计算为带符号十进制的 -1。长话短说,你的 bool 真的是一个 int 并且 ~0 是 -1

    【讨论】:

    • 解释需要一些微调。并非所有编译器实现都使用二进制补码。
    【解决方案2】:

    ! 运算符是一个逻辑运算符 - 因此 0(假)被否定为 1(真)。

    ~ 运算符是按位运算符 - 因此每一位都被否定。 bool,虽然名义上是一个位 - 可以导致 int 类型的表达式。因此,您实际上是在否定0.....000,即1...111,即-1(参见二进制补码)。

    【讨论】:

      【解决方案3】:

      当在表达式~x 中使用时,boolximplicitly convertedint。并且绝大多数计算机使用two's complement 表示有符号整数,其中~0 等于-1。

      ! 运算符被定义为!x 的类型为bool 而不是int,因此不会发生此问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-02
        • 1970-01-01
        • 2017-12-16
        • 2014-05-24
        • 1970-01-01
        • 2017-02-27
        • 1970-01-01
        相关资源
        最近更新 更多