大小端存储
大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;
小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中。
例题
1.确定此电脑是大端存储还是小端存储。
#include <stdio.h>
int check_sys()
{
int i = 1;
return (*(char *)&i);
}
int main()
{
int ret = check_sys();
if(ret == 1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}
此程序输出为小端。
无符号类型
例题1
int main()
{
char a= -1;
signed char b=-1;
unsigned char c=-1;
printf("a=%d,b=%d,c=%d",a,b,c);
return 0;
}
无符号类型的取值是0~255,在这里c的值-1会直接变成255;
例题2
int main()
{
char a = -128;
printf("%u\n", a);
system("pause");
return 0;
}
将-128的二进制写出:1000 0000,因为是无符号打印,前面的1被当做数值位,补充完就是
1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1000 0000
例题3
int main()
{
char a[1000];
int i;
for (i = 0; i<1000; i++)
{
a[i] = -1 - i;
}
printf("%d", strlen(a));
system("pause");
return 0;
}
为什么输出不是1000,而是255呢?因为strlen遇见\0就停止了,而\0实际上就是数字0,char类型的范围是-128到127,在这里a[i]从-1取到-128,进一步又到127,再依次递减到0。
浮点型在内存中的存储
常见的浮点数:3.14159 1E10 浮点数家族包括:float、double、long double类型。 浮点数表示的范围:float.h中定义
浮点数存储的例子
int main()
{
int n = 9;
float *pFloat = (float *)&n;
printf("n的值为:%d\n",n);
printf("*pFloat的值为:%f\n",*pFloat);
*pFloat = 9.0;
printf("num的值为:%d\n",n);
printf("*pFloat的值为:%f\n",*pFloat);
return 0;
}
num和*pFloat在内存中明明是同一个数,为什么浮点数和整数的解读结果会差别这么大? 要理解这个结果,一定要搞懂浮点数在计算机内部的表示方法。
根据国际标准IEEE(电气和电子工程协会) 754,任意一个二进制浮点数V可以表示成下面的形式:
(-1)^S * M * 2^E
其中(-1)^s表示符号位,当s=0,V为正数;当s=1,V为负数。M表示有效数字,大于等于1,小于2。2^E表示指数位。
例如:10.125 化为二进制数为1010.001,写成 (-1)^S * M * 2^E的形式为 (-1)^0* 1.010001* 2^3,
IEEE 754规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。
所以这里写成 0 1000 0010 0100 0100 0000 0000 0000 000 ,这就是10.125在内存中的存储值。
例题中 0x00000009还原成浮点数为 0000 0000 0000 0000 0000 0000 0000 1001,E=00000000,所以V=(-1)^0 ×0.00000000000000000001001×2^(-126)=1.001×2^(-146) 显然,V是一个很小的接近于0的正数,用十进制小数表示就是0.000000。
浮点数9.0写成二进制形式为0 10000010 001 0000 0000 0000 0000 0000,是一个很大的数,所以num值会这么大。