大小端
在X86体中 数字是以小端形式存在 的
小端的意思就是高字节 在高(内存) 地址,低字节在低(内存)地址
而大端正好相反 ,其 高字节 在低(内存)地址, 低字节 在高(内存)地址
例如
int a=1;
int 在32位或64位机 中都是4个字节,即 00000000 00000000 00000000 00000001
第一组00000000 属于高字节
高字节 在内存高地址,
内存低地址 内存高地址
---------------------------------------------------------------------------------------------->
000000001 00000000 00000000 00000000
用一个程序证明下
#include <stdio.h> #include <stdlib.h> int main(){ int a=1; char b[4]; b[0]= (char)a; b[1] = (char)(a>>8); b[2] = (char)(a>>16); b[3] = a>>24; int c=0; c = (int)b[0] | (int)b[1] <<8 | (int)b[2] << 16| (int)b[3]; printf("转后的数值为%d\n", c); return 0; }
(gdb) p a
$1 = 1
(gdb) p &a
$3 = (int *) 0x7fffffffe4cc
(gdb) x/4bu 0x7fffffffe4cc
0x7fffffffe4cc: 1 0 0 0
转后的数值为1
如果要通过程序存储为大端模式呢
#include <stdio.h> #include <stdlib.h> int main(){ int a=1; char b[4]; b[0]=(char)a>>24; b[1]=(char)a>>16; b[2]=(char)a>>8; b[3]=(char)a; int c=0; c = (int)b[0]<<24 | (int)b[1] <<16 | (int)b[2] << 8| (int)b[3]; printf("转后的数值为%d\n", c); return 0; }
(gdb) p b
$1 = "\000\000\000\001"
(gdb) p &b
$2 = (char (*)[4]) 0x7fffffffe4c0
(gdb) x/4bu 0x7fffffffe4c0
0x7fffffffe4c0: 0 0 0 1