非常简单。我们说我有:
char x = -1;
然后在记忆中,我(很可能是?)
11111111
(01234567)
所以我的问题是,如果我写&x
是地址,我会回到第0位或第7位的地址,这是最重要还是最不重要的位?
在32位整数的情况下呢?
答案 0 :(得分:5)
存储器地址是字节寻址的,而不是位寻址的。这意味着您将 - 根据架构的类型(大端或小端),您将获得最重要的字节或最不重要的字节而不是特定的位< / em>的
感谢WhozCraig,是的 - 因为你的变量是char
,它是char
的地址或字节本身。
答案 1 :(得分:3)
比特不是可单独寻址的。内存的最小可寻址单位是字节。因此,在char
的情况下,当您获取其地址时,您将获得指向该字节的指针。该字节中没有任何特定位,即整个字节。访问该字节中单个位的唯一方法是通过按位操作,如屏蔽和移位。
对于32位整数,您可以单独寻址4个字节。在这种情况下,其地址是最低有效字节还是最高有效字节的地址取决于体系结构endianness。在大端系统上,地址将是最重要字节的地址。在一个小端系统上,它将是最不重要的字节。
uint32_t n = 0x11223344;
uint8_t *p = (uint8_t *) &n;
if (*p == 0x11) {
// big endian
}
else if (*p == 0x44) {
// little endian
}
答案 2 :(得分:2)
在C中,内存字节可寻址,char的解释也是字节。 char由一个字节组成,例如int由四个字节组成,因此char x;
然后&x;
是char的地址而不是位/字节。如果你取int i
那么&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位。
我的意思是说couser位可以编号(0-15),但有效是一次访问一个字节。即使你需要一位信息,也可以阅读完整的字节。
您是否阅读过此问题:What exactly is a C pointer if not a memory address?。如果您询问C: A指针值可以是某种ID或句柄或多个ID的组合
所以
&x
只是C中的引用。它引用char
的一个字节和int
的四个字节
此外,
尽管内存是字节可寻址的,但幸运的是,我们可以在位级别bitwise operator和bitwise structure 进行访问。
答案 3 :(得分:1)
地址是指内存中的字节 - 位没有各自的地址。
也就是说,假设该值大于单个字节:
long x = -1;
在这种情况下,该值占用32位或4个字节。这些位是先存储最高有效字节还是最低有效字节先取决于所涉及的硬件。更具体地说,它取决于硬件是否为little endian or big endian。无论哪种方式,上例中x
的地址都是内存中第一个(最低)字节的地址,所以如果你有:
char p[4] = (char*)&x;
然后p[0]
将是第一个字节,p[1]
将是第二个字节,依此类推。 Endianness只是告诉你第一个字节是最重要的还是最不重要的。
答案 4 :(得分:0)
地址指的是整个字节,所以询问一下地址是没有意义的。大多数现代计算机都是little-endian(请参阅this question),因此您应该获取最低有效字节的地址。
答案 5 :(得分:0)
正如大多数人所指出的,内存是字节可寻址的,并且位没有单独的地址。如果你想访问这些位(读/写),你可以使用按位逻辑的位移操作。