------------------------------------------------------------
机器大端,小端的判别。
------------------------------------------------------------
#include <stdio.h>
#include <string.h>
unsigned char d[4]={
0x12,0x34,0x56,0x78
}; // 我们知道,字符数组总是从低地址向高地址排列的.
int main()
{
int *p=(int *)d;
printf("d[0] addr:%p\n",&d[0]);
printf("d[1] addr:%p\n",&d[1]);
printf("data: %x\n",*p); // 解引用,从内存中取数据
return 0;
}
/* 内存中,0x12 在前(地址低位),这个12,到底是数据的高位还是低位呢?
/* 打印结果:
* data: 78563412 12在数据低位, 低位在前, 叫little-endian, 翻译为小端,也有人叫小尾端,小端序. intel cpu 如此排列
* data 12345678 12是数据高位, 高位在前, 叫 big-endian , 翻译为大端,大尾端, 大端序. PowerPC 是大端序.
* */
------------------------------------------------------------
int ,long, long long 尺寸大小的判别
------------------------------------------------------------[/pts/0@hjj ~/test]$ cat test.c
#include <stdio.h>
#include <unistd.h>
int main()
{
int i=10;
int j=11;
long l=1;
long long ll=2;
printf("int size is %ld\n",sizeof(int));
printf("long size is %ld\n",sizeof(long));
printf("long long size is %ld\n",sizeof(long long));
printf("i is %d, j is %d, l is %ld, ll is %lld\n",i,j,l,ll);
printf("i is %p, j is %p, l is %p, ll is %p\n",&i,&j,&l,&ll);
return 0;
}
以我的机器为例。我的机器cpu是64bits 的, 如下结果。
[/pts/0@hjj ~/test]$ ./test
int size is 4
long size is 8
long long size is 8
i is 10, j is 11, l is 1, ll is 2
i is 0x7ffe94075040, j is 0x7ffe94075044, l is 0x7ffe94075048, ll is 0x7ffe94075050
显而易见, int 大小为4, long 为8, long long 还是8 bytes, 即64bits
地址只用到了低位48bits.
linux 下,只需要查询ls 文件信息,便可立即判断出你机器是否是小端序,是几bits cpu
$which ls
/bin/ls
$file /bin/ls
/bin/ls: ELF 64-bit LSB shared object, x86-64
可见是64bit, x86-64, LSB(least significent bit first) 小端序.