这很简单。假设我有:
char x = -1;
然后在记忆中,我有(很可能?)
11111111
(01234567)
所以我的问题是,如果我写&x
的是地址,我会得到第 0 位或第 7 位的地址,这是最高有效位还是最低有效位?
如果是 32 位整数呢?
内存地址是字节寻址的,而不是位寻址的。这意味着您将 - 根据架构的类型(大端或小端),您将获得最高有效字节或最低有效字节而不是特定位
感谢 WhozCraig,是的 - 因为您的变量是 achar
它是char
或字节本身的地址。
位不可单独寻址。内存的最小可寻址单元是字节。所以在 a 的情况下char
,当你获取它的地址时,你会得到一个指向那个字节的指针。该字节中没有任何特定位,而是整个字节。访问该字节中各个位的唯一方法是通过按位操作,如屏蔽和移位。
对于 32 位整数,您可以单独寻址 4 个字节。在这种情况下,它的地址是最低有效字节还是最高有效字节的地址取决于架构的字节序。在大端系统上,地址将是最高有效字节的地址。在小端系统上,它将是最低有效字节。
uint32_t n = 0x11223344;
uint8_t *p = (uint8_t *) &n;
if (*p == 0x11) {
// big endian
}
else if (*p == 0x44) {
// little endian
}
在 C 中,内存是字节可寻址的,char 的解释也是字节。char 由一个字节组成,例如 int 由四个字节组成,因此char x;
char&x;
的地址不是位/字节。如果你采取int i
then&i
是 int 对象的地址。我们正在刷新变量/完整对象。
在内存地址方案中,每个字节都被存储(地址存储)。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
+----+----+----+---+---+----+----+----+----+----+----+---+---+----+----+----+
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 0 | 1 | 1 | 2 | 3 | 4 | 5 | 6 |
+----+----+----+---+---+----+----+----+----+----+----+---+---+----+----+----+
^ ^
| |
+----+----+ | |
| add1 |--| |
+----+----+ |
| add2 |-----------------------------|
+----+----+
在此图addr1
中,如果是 char,则表示位 0-7,并addr2
表示位 8-15。我的意思是说 ofcouser 位可以编号(0-15),但有效的是一次访问一个字节。即使您需要一位信息,也可以读取完整的字节。
你读过这个问题吗:如果不是内存地址,C 指针到底是什么?. 如果您询问 C:指针值可以是某种 ID 或句柄或多个 ID 的组合
所以
&x
只是 C 中的一个引用。它引用一个字节char
,四个字节int
此外,
地址指的是内存中的字节——位没有自己的地址。
也就是说,让我们假设该值大于单个字节:
long x = -1;
在这种情况下,该值占用 32 位或 4 个字节。这些位是先存储最高有效字节还是先存储最低有效字节取决于所涉及的硬件。更具体地说,这取决于硬件是little endian 还是 big endian。无论哪种方式,x
上面示例中的地址都是内存中第一个(最低)字节的地址,所以如果你有:
char p[4] = (char*)&x;
然后p[0]
将是第一个字节,p[1]
第二个字节,依此类推。字节序只是告诉你第一个字节是最重要的还是最不重要的。
地址指的是整个字节,因此询问位的地址是没有意义的。大多数现代计算机都是little-endian(请参阅this question),因此您应该获得最低有效字节的地址。
正如大多数人所指出的,内存是字节可寻址的,位没有单独的地址。尽管如此,如果您想访问这些位(读/写它们),您可以将位移位操作与按位逻辑操作一起使用。