数据的存储

数据类型介绍

1.类型的基本归类:
整形家族:
1)char:包括 unsigned char(无符号字符), signed char(有符号)
2)int:包括 unsigned int(无符号), signde int (有符号)
3)short :包括 unsigned short [int] ,signed short [int]
4)long:包括 unsigned long [int] ,signed long [int]

浮点数家族:
float ,double

构造类型:

数组类型
结构体类型 struct
枚举类型 enum
联合体类型 union
指针类型: int* ,char*, float* ,void*
空类型 void 通常运用于函数的返回类型,函数的参数,指针类型。

整形在内存中的存储

结论:整形数据的存放都为补码。

原码,反码,补码的介绍

计算的符号表示有三种方式,即原码,反码,补码方式,三种表示法均有符号位和数值位,符号位(最高位置bit)用0表示正数,用1表示负数

1.对于正数来说:原码等于反码等于补码,即直接将数值翻译为二进制形式写出即可
2.对于负数来说:
原码:同正数,直接将数值翻译为二进制形式写出即可
反码:原码符号位不变,其他位按位取反
补码:反码+1即得到补码

例:b = -10;
原码: 10000000 00000000 00000000 00001010
反码: 11111111 11111111 11111111 11110101
补码: 11111111 11111111 11111111 11110110
a = 10;
原码=反码=补码:00000000 00000000 00000000 00001010

整形的两种存储方法
前提:因为int short等整形内存空间大于1字节,因此存在多个字节的安排问题。
大端存储模式:将数据的低位存储在内存高地址中,数据高位存储在内存低地址中。
图示:以存储0x11223344为例
大端存储模式

小端存储模式:将数据的低位存储在内存低地址中,数据高位存储在内存高地址中。
图示:以0x11223344为例
小端模式存储
一道例题:
题目:设计一个小程序来判断当前电脑的字节序
思路:只需要以1的存储为例,取出1内存的首字节地址,如果为01,则为小端存储,如果为00,则为大端存储。
要点:用char类型截断取出首字节地址。
代码实现:

#include<stdio.h>
int main( )
{
    int n = 1;
    char* a = (char*)&n;
    if(a == 1)
    {
        printf("小端\n");
    }
    else
    {
        printf("大端\n");
    }
    
    return 0;
}

浮点数在内存中的存储

浮点数在计算机内部的存储方式
根据国际标准IEEE754,任意一个二进制浮点数可以表示为以下方式:

(-1) ^ S * M * 2 ^ E
S表示符号位,0为正数,1为负数
M表示有效数字,大于等于1,小于2
E表示指数位
例:十进制数字5.5在计算机内部的存储方式:
二进制:101.1(2) 也可表示为:1.011 * 2^2
S = 0, M = 1.011,E = 2

IEEE754规定:对于32bit的浮点数,最高一位为符号位S,接下来的8位为指数位E,接下来的23位为有效数字M。
图示:
在这里插入图片描述
对于64位浮点数,最高的一位为符号位,接着的11位为指数位,剩下的52位为有效数字位
图示:
在这里插入图片描述
IEEE 754对有效数字M和指数E,还有一些特别规定。

对于有效数字M
前面说过, 1≤M<2 ,也就是说,M可以写成 1.xxxxxx 的形
式,其中xxxxxx表示小数部分。
IEEE 754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的xxxxxx部分。比如保存1.01的时候,只保存01,等到读取的时候,再把第一位的1加上去。这样做的目的,是节省1位有效数字。以32位浮点数为例,留给M只有23位,将第一位舍去后,等于可以保存24位。

对于指数E
1.E为一个无符号整数,则E不可为负数,当E为8位时,取值范围为0 ~ 255,当E为11位时,取值范围为0 ~ 2047,但是事实上E有负数的情况,所以规定,存入E的值时,必须在真实值上加入一个中间值。在32位时中间值为127,64位时中间值为1023。例如在存入32位的2时,实际存入的是2+127=129。也就是10000010
2.E从内存中取出时分为3种情况
1)E不全为0或者不全为1时。
指数E减去127(1024),再将M之前添加1.例如,对于5.5的32位存储,S=0,E=2,M=1.011
则E为2+127 = 129 即1000 0010,M减一得到01100000000000000000000
0 10000010 01100000000000000000000
2)E为全0时,E为-126(-1023),M不再加上1,就写为0.XXXXXX的小数,表示一个十分接近0的数
3)E为全1时,这时,如果M全为1,则表示一个无限±无穷大的数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值