我对内存地址有点困惑,据我所知,每个内存地址的大小为1字节(8位),每个内存地址都有自己的十六进制地址0x122.,现在当我们存储一个32位的int,需要4个字节,现在计算机合并每个1字节地址(0x123,0x124..)组成一个新的4字节地址。
smtd7mpg1#
内存地址本身就是一个字节的位置。要访问超过一个字节的对象,我们同时使用地址和 * 类型 *。要指定多个字节的对象的地址,我们使用第一个字节的地址。在C语言中,一个对象的字节数可以从它的类型中得知。C语言的语义被指定为所有引用一个对象的表达式都有一个类型,并且从该类型可以知道要访问多少字节。
bvn4nwqk2#
一张照片可能会有帮助。假设一个4字节整数0x01234567。给定起始地址0x1000,它将被存储为
0x01234567
0x1000
Little-endian Big-endian ------------- ---------- +----+ 0x1000: | 67 | :0x1003 +----+ 0x1001: | 45 | :0x1002 +----+ 0x1002: | 23 | :0x1001 +----+ 0x1003: | 01 | :0x1000 +----+
每个字节仍然有一个唯一的地址。在little-endian系统中,最低有效字节是寻址字节,而在big-endian系统中,最高有效字节是寻址字节。如果你有第二个整数0x89abcdef,它可以被布局为
0x89abcdef
Little-endian Big-endian ------------- ---------- +----+ 0x1000: | 67 | :0x1003 +----+ 0x1001: | 45 | :0x1002 +----+ 0x1002: | 23 | :0x1001 +----+ 0x1003: | 01 | :0x1000 +----+ 0x1004: | ef | :0x0FFF +----+ 0x1005: | cd | :0x0FFE +----+ 0x1006: | ab | :0x0FFD +----+ 0x1007: | 89 | :0x0FFC +----+
两个对象的起始地址相隔4个字节--在little-endian布局中为0x1000和0x1004,在big-endian布局中为0x0FFC和0x1000。
0x1004
0x0FFC
2条答案
按热度按时间smtd7mpg1#
内存地址本身就是一个字节的位置。要访问超过一个字节的对象,我们同时使用地址和 * 类型 *。
要指定多个字节的对象的地址,我们使用第一个字节的地址。
在C语言中,一个对象的字节数可以从它的类型中得知。C语言的语义被指定为所有引用一个对象的表达式都有一个类型,并且从该类型可以知道要访问多少字节。
bvn4nwqk2#
一张照片可能会有帮助。假设一个4字节整数
0x01234567
。给定起始地址0x1000
,它将被存储为每个字节仍然有一个唯一的地址。在little-endian系统中,最低有效字节是寻址字节,而在big-endian系统中,最高有效字节是寻址字节。
如果你有第二个整数
0x89abcdef
,它可以被布局为两个对象的起始地址相隔4个字节--在little-endian布局中为
0x1000
和0x1004
,在big-endian布局中为0x0FFC
和0x1000
。