低位存放在高地址,高位存放在低地址。
例如:
/* $begin show-bytes */
#include <stdio.h>
/* $end show-bytes */
#include <stdlib.h>
#include <string.h>
/* $begin show-bytes */
typedef unsigned char *byte_pointer;
void show_bytes(byte_pointer start, int len) {
int i;
for (i = 0; i < len; i++)
printf(" %.2x", start[i]); //line:data:show_bytes_printf
printf("\n");
}
void show_twocomp()
{
/* $begin show-twocomp */
short y1 = 1;
short x = 12345;
short mx = -x;
show_bytes((byte_pointer)&y1, sizeof(short));
show_bytes((byte_pointer)&x, sizeof(short));
show_bytes((byte_pointer)&mx, sizeof(short));
/* $end show-twocomp */
}
int main()
{
printf("calling show_twocomp\n");
show_twocomp();
return 0;
}
程序中,show_bytes()
是按地址从小到大的顺序将地址中的信息以字节为单位读取,并用两位十六进制数表示出来。show_twocomp
是示例,举了三个short
型整数(short
为2字节,每字节为8位,也就是说,short
型整数长16位)。
其中 short y1=1
,在内存中用二进制存储,应该是0000 0000 0000 0001
,但windows系统存储信息时是从地址从高到低,对应信息从小到大。也就是说,short y1=1
,在内存中实际存储时,应该是这样的:0000 0001 0000 0000
(地址从低到高)。所以,调用show_bytes()
读取,初始指针指向最低地址,首先读取到的是:0000 0001
,用两位十六进制表示为01
。然后指针移向下一字节,即:0000 0000
,用两位十六进制表示为00
。所以,最终读取并用十六进制表示的结果为01 00
。
同理,short x=123456
,用二进制表示为0011 0000 0011 1001
,在内存中实际存储时,按地址从低到高的顺序,应该是这样的0011 1001 0011 0000
(即,低地址存放高位,高地址存放低位)。那么,在调用show_bytes()
时,初始指针指向低地址,读取出的信息为0011 1001
,用两位十六进制表示为39
,然后指针移向下一字节,读取信息0011 0000
,用两位十六进制表示为30
,所以,最终显示结果为39 30
。
而第三个例子short mx=-x
,我们知道,计算机中负数是用补码表示的。mx=-x
即mx=-123456
,即mx=-0011 0000 0011 1001
,用补码表示为1100 1111 1100 0111
(补码即原码取反加一),存储在内存中,应为1100 0111 1100 1111
(地址从小到大)。调用show_bytes()
读取时,初始指针指向低地址,读取出的信息为1100 0111
,用两位十六进制表示为c7
,然后指针移向下一字节,读取信息1111 1100
,用两位十六进制表示为cf
。因此,最终显示结果为c7 cf
。