c++ 了解十六进制和内存地址

tf7tbtn2  于 2023-01-18  发布在  其他
关注(0)|答案(1)|浏览(279)

由于每个十六进制数字对应于4位,内存的每个字节需要2个十六进制数字,为什么下面代码中内存地址的增量发生在半字节中,而不是整个字节?

#include <iostream>

  using namespace std;

  int main()
  {
    int a , b, c, d;
   
    cout << &a << "\t" <<  &b << "\t" <<  &c << "\t" <<  &d << endl;
  
    cout << (long) &a << "\t" <<   (long)&b << "\t" <<  (long) &c << "\t" <<   (long)&d << endl;

    return 0;
}

正如你在下面的输出中看到的,int类型的内存地址增量只发生在半字节中,例如,第一个增量是从58到5c(从8到c有4个半字节),4个半字节只是2个字节,而不是4个字节。
输出:

0x7ffdc94b6e58  0x7ffdc94b6e5c  0x7ffdc94b6e60  0x7ffdc94b6e64
140727980617304 140727980617308 140727980617312 140727980617316
svmlkihl

svmlkihl1#

140727980617304 140727980617308

正如您所看到的,这两个地址之间的差值为4。指针地址基本上是内存地址。这些地址相距4个字节。您的int占用4个字节长。因此,存储在内存中的连续int将相距4个地址。
从8到c的4个半字节
您将一个用于描述单个十六进制数的表示形式的术语与内存地址混为一谈。
“nybble”与十六进制之比就像“digit”与我们自然的以10为基的数字表示法之比一样。
无论每个内存地址是以十六进制数(由四位字节组成)还是以十进制数(由数字组成)表示,都没有什么区别。无论您选择将它们视为十六进制四位字节还是十进制数字,上述两个内存地址相差4。内存地址之间相隔4个地址。

相关问题