所以要将一个字符指针char* cp强制转换为这个整形地址,由于字节序的不同会带来差异。在小端机器上cp[0]指向最低位地址,存放的是0x78,然而cp[3]指向最高位地址,存放的是0x12;大端反之。 可以用gdb调试查看,内存内部的变量分布,gdb内存查看命令: x /nfu addr 说明 x 是 examine 的缩写 n表示要显示的内存单元的个数 f表示显示方式, 可取如下值 x 按十六进制格式显示变量。 d 按十进制格式显示变量。 u 按十进制格式显示无符号整型。 o 按八进制格式显示变量。 t 按二进制格式显示变量。 a 按十六进制格式显示变量。 i 指令地址格式 c 按字符格式显示变量。 f 按浮点数格式显示变量。 u表示一个地址单元的长度 b表示单字节, h表示双字节, w表示四字节, g表示八字节 参考博文:gdb查看内存区命令
小端模式内存查看实验:
int main(int arc, char* arg[])
{
unsingned int a = 0x12345678;
while(1);
}
编译:
编译必须加-g选项才能生成可调试的文件
gcc littleEnding.c -g -o littleEnding
调试:
(gdb)gdb ./littleEnding
(gdb)b 4//源文件第四行设置断点
(gdb)r //执行程序
(gdb)p &a //打印变量地址
$1 = (unsingned int *)0xbffff543
(gdb)x 0xbffff543//查看内存单元内变量0xbffff543: 0x12345678
(gdb) x /4xb 0xbffff543//单字节查看4个内存单元变量的值0xbffff543: 0x780x560x340x12
(gdb) x /1xb 0xbffff5430xbffff543: 0x78
(gdb) x /2xb 0xbffff5430xbffff543: 0x56
(gdb) x /3xb 0xbffff5430xbffff543: 0x34
(gdb) x /4xb 0xbffff5430xbffff543: 0x780x560x340x12//可以看到内存最低地址单元存放的是数据的LSB 0x78//显然linux x86下是小端的存放方式