【问题标题】:C++ Primer Exercise 4.25 converting binary numberC++入门练习4.25转换二进制数
【发布时间】:2022-01-10 11:10:20
【问题描述】:

我有一个关于 C++ Primer 中练习 4.25 的问题:

练习 4.25:在 32 位机器上 ~'q'

我有二进制的解决方案,但我不明白它是如何转换为 int 的:

int main()
{
    cout << (std::bitset<8 * sizeof(~'q' << 6)>(~'q' << 6))<<endl;
    cout << (~'q' << 6) << endl;
    return 0;
}

执行后,打印以下2行:

11111111111111111110001110000000

-7296

第一行是我所期望的,但我不明白它是如何转换为-7296的。 我希望有更多的数字。在线转换器也给出了不同的结果。

提前感谢您的帮助。

【问题讨论】:

  • 您是否对11111111111111111110001110000000 表示整数-7296 感到困惑。这是因为 2s 补码表示的工作原理:可能的最小数字表示为 1000...00,加一会将数字加一,直到达到 111...11,即 -1
  • 顺便说一句:假设您使用的是 windows(不确定 linux 等是否提供类似功能),您可以稍微玩一下 2s compelement 表示:启动计算器并进入程序员模式,然后对于 32 位数字,切换到 DWORD;您将能够并行查看十进制、十六进制、八进制和二进制表示。
  • 嗯,好的,现在我明白了。我对负数的表示如何工作有不同的想法。我认为最高位代表 +/- 符号,其余位使用与无符号值相同的方法给出值。 (所以我认为,例如,带符号的 int 0001 = +1 和 1001 = -1)但现在很清楚,谢谢。 :)

标签: c++ binary


【解决方案1】:

为了回答这个问题,我们需要分析一下偏表达式是什么类型,在发挥作用的运算符的优先级是什么。

对此我们可以参考character constantoperator precedence

'q' 表示第一个链接中描述的 int:

单字节整数字符常量,例如'a' 或 '\n' 或 '\13'。 此类常量的类型为 int ...

'q' 因此等价于其 Latin-1 代码(二进制 01110001)的 int 值,但扩展为适合 32 位整数:00000000 0000000 00000000 01110001

运算符 ~ 在运算符 &lt;&lt; 之前,因此将首先执行按位求反。结果是11111111 11111111 11111111 10001110

然后执行按位左移(删除值的左侧 6 位并在右侧用 0-s 填充):11111111 11111111 11100011 10000000

现在,关于问题的后半部分:cout &lt;&lt; (~'q' &lt;&lt; 6) &lt;&lt; endl; 将此值解释为 int(有符号)。 standard 声明:

但是,所有 C++ 编译器都使用二进制补码表示,从 C++20 开始,这是标准允许的唯一表示,保证范围为 -2N−1 到 +2N−1−1 (例如,有符号的 8 位类型为 -128 到 127)。

在 32 位机器上,11111111 11111111 11100011 10000000 的二进制补码值生成十进制 -7296 的二进制代码。 这个数字并不像您期望的那样大,因为当您从十进制 -1(11111111 11111111 11111111 11111111 二进制)开始倒计时,二进制表示都有很多前导 1-s。最左边的位是 1 表示负数,0 表示正数。当您将负值扩展到更多位时(例如,从 32 到 64),您将在左侧添加更多 1-s,直到达到 64 位。更多信息可以找到here。这里是an online converter

【讨论】:

    【解决方案2】:

    我不明白它是如何转换为 -7296 的。

    它(第二个值)是 带符号 2 的补码的小数

    【讨论】:

      【解决方案3】:
      ~'q' << 6
      = (~'q') << 6
      = (~113) << 6
      = (~(0 0111 0001)) << 6
      = 1 1000 1110 << 6
      = -7296
      

      您可能忘记在 113 前面添加一些 0

      【讨论】:

        猜你喜欢
        • 2021-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多