【问题标题】:Counting Sign Bit in 2's Complement in Memory Address计算内存地址中 2 的补码中的符号位
【发布时间】:2015-01-08 05:17:58
【问题描述】:

在c++中,如果变量的内存地址显示为0XFFF,例如,我不确定它是2047还是4095(包括“符号位”)。 0xFFF 是二进制的 1111 1111 1111。我最近了解了“符号位”,它只是指示数字是正数还是负数。我的另一个猜测是,在转换为 2 的补码正数后,它将是 0000 0000 0001。 所以我的问题是:0XFFF 的内存地址是否表明它是 4095 或 2047?或者,也许是 1?

【问题讨论】:

  • 2 的补码 not 有符号位。那是1的补码。在 2 的补码中,最高有效位的值与其通常值相反。这就是 0xFFF = -2048 + 2047 的结果是 -1,而不是 -0。

标签: c++ memory-management twos-complement


【解决方案1】:

0xFFF 可以是任一。在十六进制中,它只是位 - 剩下的就是你如何解释它。它还取决于我们正在谈论的数据类型的宽度。

假设您没有使用 12 位数据类型,您显示的特定值是总是 4095。

现在,如果我们确定整数的宽度,并选择不同的值,事情会变得更有趣。取一个 16 位的值 0xFFFF,例如:

  • 解释为一个无符号整数(即uint16_t),它是65535。
  • 作为一个有符号整数(即int16_t),它是-1。

【讨论】:

  • “24 位数据类型”。这将根据通货膨胀进行 12 位调整。
  • @n.m.我只能想象我的思路是如何以 24 位结束的。 “4095 是 12 位 DAC 的最大值。DAC 用于音频。音频使用 DSP。一些 DSP 具有 24 位寄存器。是的,它是 24 位!”
  • 如果我将 unsigned/signed int 分配给 0xFFFF,它们都变成了 65,535。但是如果我将 int 分配给 0xFFFFFFFF,它就会变成 -1。是因为 int 是 4 个字节吗?似乎二进制数也必须是 4 个字节才能使整数得到我想要得到的东西。
  • 这一切都在你的变量声明中,以及你如何打印它。你还没有展示这些东西。如果没有看到您的代码,我无法帮助您。请编辑您的原始问题以显示您所看到的确切内容(您的代码和输出)。
【解决方案2】:

内存地址通常被视为无符号值,因此二进制补码在这方面实际上并没有发挥作用。

对于有符号的 C++ 原始类型,标准并不关心。是否存储为二进制补码由 CPU 架构决定,x86 和大多数架构都使用二进制补码,因为它易于硬件实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 2021-09-09
    • 2011-06-23
    相关资源
    最近更新 更多