【问题标题】:Adding one byte to a hexadecimal number将一个字节添加到十六进制数
【发布时间】:2014-07-14 09:09:17
【问题描述】:

我似乎把自己弄糊涂了,以至于这不再有意义了。

1 字节 = 8 位。

所以如果我有一个内存位置,例如

0xdeadbeef
3735928559 (base10)
1101 1110 1010 1101 1011 1110 1110 1111

现在,如果我将 一个字节 添加到 0xdeadbeef,我要添加的二进制序列是什么?是1000吗?如果我添加 1 位,我会得到 0xdeadbee0,如果我添加 1 位 8 次,我会得到 0xdeadbef7。哪个是正确的?

我记得微处理器中的计数器在 PC += 4 中递增,得到0xdeadbef3,所以我不确定哪个是正确答案。

【问题讨论】:

  • 这个问题没有意义......问你如果添加“一个字节”会得到什么就像问如果你将“一个数字”添加到十进制数会得到什么......它取决于它是什么数字!
  • @MatteoItalia 抱歉,我指的是内存位置。现在有意义吗?
  • 好的,所以如果该地址是一个内存位置(以字节为单位),如果向前移动一个字节,则该数字会加一。
  • 我认为你在这里有一些严重的困惑。
  • @HotLicks:这是唯一真正清楚的事情:)

标签: c binary boolean hex


【解决方案1】:

当您将 1 添加到字长地址时,1 被解释为十进制值为 1 的字长位字符串。

对于您的情况,0xdeadbeef 具有 32 位或 4 字节。所以加1就像做0xdeadbeef + 0x00000001。添加300就像0xdeadbeef + 0x0000012C

如果您想知道是否可以向地址添加超过字长的内容,这是不可能的,因为地址不能大于或小于字长。

【讨论】:

    【解决方案2】:

    在计算机中,每个内存位置都保存 8 位(1 字节)的数据。因此,当我们添加 1 个字节时,它只会将 1 个字节添加到内存位置。

    【讨论】:

      【解决方案3】:

      如果,正如我所收集的,那是一个内存地址,它以“基(零)地址之后的字节数”来衡量,如果你在内存中向前移动一个字节,那么内存地址就会增加一。

      可以这样想:如果您以米为单位测量距离道路起点的距离,如果您向前移动一米(这是您的测量单位),则距离起点的距离增加 1。

      请注意,尽管 C(和 C++)中的指针以一种稍微令人困惑的(起初)方式工作:如果您的指针是 T * 类型,则对 if 的每个算术运算都以 T 为单位执行,所以底层内存地址以sizeof(T) 为步长移动。

      例如,如果您有:

      int a[2];
      int *ptr=a;
      int *ptr2=ptr+1;
      printf("Delta in ints: %d", (int)(ptr2-ptr));  // will print 1
      char *cptr=(char *)ptr;
      char *cptr2=(char *)ptr2;
      printf("Delta in chars: %d", (int)(cptr2-cptr)); // will print sizeof(int), typically 4
      

      【讨论】:

        【解决方案4】:

        我从您的问题中了解到,您对向计数器添加位和字节感到困惑。
        由于内存地址以字节为单位(在编程语言中),因此对其进行的任何算术运算都以字节为单位。
        要递增计数器,将1 添加到它就像将其递增到基地址旁边的一个字节。将1 添加到0xdeadbeef 会将其增加到0xdeadbef0

        【讨论】:

        • 正确。如果我添加 1 字节或 1 位,我仍然会以0xdeadbef0 结尾,由于 1 字节等于 8 位,我自己对此感到困惑。我认为正确的术语是 1 字节代表 8 位而不是等于?
        • 是的。你说的对。一点是01。一个字节是0000 00001111 1111 之间的任何序列。所以,1-byte 由8-bits 表示。
        • “由于内存地址以字节为单位(在编程语言中),因此对其进行的任何算术运算都以字节为单位。”注意,在 C 中,指针的操作是以指针的基类型为单位执行的。
        • 视情况而定。 int *ptrint 为单位,因此如果您使用ptr++,则底层内存地址将增加sizeof(int)
        • @MatteoItalia;我知道。这就是为什么我使用通用术语“字节”而不是“一个字节”。
        【解决方案5】:

        我指的是内存位置。

        所以 0xdeadbeef 是一个地址。如果将其增加 1 个字节,则只需将其加 1。 即0xdeadbeef + 1 = 0xdeadbef0

        结论 看起来像向地址添加 1 位会使指针增加 1 个字节,因为您以字节粒度访问内存并根据字节数增加内存。但实际上您添加了数字 1(即 0x00000001)。如果您想增加 4 个字节,请将 4 添加到地址,因为内存是按字节数寻址的(单位)。

        【讨论】:

        • OP 使用了 deadbeef,但这并不重要
        • 是的,我用他的例子来表示add 1 byte。我错过了什么吗?
        【解决方案6】:

        什么是增加一个字节?字节需要有值。 您需要将 number 添加到数字,而不是大小(8 位)到数字...

        如果您要添加的字节 = 0x08 --> 1000 in binary ,并且 0xdeadbeef+ 0x08 = 0xdeadbef7

        【讨论】:

          猜你喜欢
          • 2013-02-18
          • 2015-08-08
          • 1970-01-01
          • 2017-09-13
          • 2023-03-14
          • 2011-01-30
          • 2020-03-07
          • 1970-01-01
          相关资源
          最近更新 更多