把一个int类型的整数储存在计算机里,比如一个int类型的数,用16进制表示后,可以表示为0x01234567,刚好4个字节,在C语言中就把它取一个变量名为a,则假设&a=0x100处,那么它的地址范围是0x100~0x103,这里就出现了两种储存方法,有“大端法”和“小端法“,大端法是
大端法: 0x100 0x101 0x102 0x103
……. | 01 | 23 | 45 | 67 | …… |
小端法: 0x100 0x101 0x102 0x103
… | 67 | 45 | 23 | 01 | … |
下面我用一个简单的C语言程序来演示一下,他妈的int类型的数是怎么存在我的计算机中的,
#include<stdio.h>
typedef unsignedchar * byte_pointer;
voidshow_bytes(byte_pointer start, int len)
{
int i;
for(i = 0; i < len; i++)
{
printf("%.2x ", start[i]);
}
printf("\n");
}
voidshow_int(int x)
{
show_bytes((byte_pointer) &x,sizeof(int));
}
voidshow_float(float x)
{
show_bytes((byte_pointer) &x,sizeof(float));
}
int main()
{
int a = 223;
float b = 20.59375f;
show_int(a);
show_float(b);
return 0;
}
这段代码在VC6.0的运行结果
然而在我计算机组成原理当中学过的float类型的小数在计算机中存储的形式是:
0 100 0001 1010 0100 1100 0000 0000 0000(B)=41 a4 c0 00(H)
从这里你看出你的计算机是通过大端法存储的还是小端法存储的啦。 很显然是小端法存储的。
以上是在linux中的gcc里面运行结果
其实在mac的机子的XCode上运行也是这个结果
通过上面那个程序你还能发现什么,还是计算机中数是怎么存储的,比如说一个int类型的数,int类型的数的最大值是2147483647,用十六进制表示的形式为:7f ff ff ff(h)
那么对于小端法存储的计算机则可以这么表示ff ff ff 7f,那么闭2147483647这个数大一的数是什么呢,是 -2147483648, 注意前面的负号,它在这种小端法存储的计算机中是这么存储的:80 00 00 00 ,而不是把这个-2147483648数先转化成十六进制,然后进行转化的。,只不过在前面2147483647的基础上加一而已(16进中的加一);