大小端存储与浮点数的存储

 大小端存储

大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;
小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中。

例题
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值会这么大。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值