学习记录---数据在内存中的存储

 目录


常见内置数据类型介绍:

一、数据类型的归类

1.整形:

2.浮点数:

3.构造类型

4.指针类型

5.空类型

二、大小端介绍

三、整型在内存中的存储

1、原码、补码、反码 

2.整型练习

四、浮点数在内存中的存储

1.浮点数的表示方法

 2.有效数字M和指数E-----特别规定。

(1)M

(2)E不全为0或不全为1

 (3)E全为0

(4)E全为1 

3.浮点数例题


常见内置数据类型介绍:

char             //字符数据类型

short            // 短整型
int                // 整形
long            // 长整型
long long   // 更长的整形
float            //单精度浮点数
double       // 双精度浮点数

一、数据类型的归类

1.整形:

注:[ ]中的 int 可以省略

 看到这里想必很多人会产生疑惑:咦,(unsigned、signed)char 不是字符类型吗?为什么会归于整形这一类嘞?

其实字符在内存中存储的其实是对应的ASCII码值,ASCII码值是整型所以就将字符类型归类到了整形家族里面去。

另外:switch-case语句的使用,因为switch  (表达式),表达式只能是整型类型。

这也辅证了char归于整形类型的:

2.浮点数:

只有俩:

float

double

那么都是浮点数,float、double又有什么区别呢?那么请继续往下看吧。

3.构造类型

> 数组类型
> 结构体类型        struct
> 枚举类型         enum
> 联合类型         union

4.指针类型

int * pi ;
char * pc ;
float* pf ;
void* pv ;

5.空类型


二、大小端介绍

计算机能够处理的是二进制的数据,那么一个整数对应的二进制序列在内存中存放时,理论上就能产生多种存储方式,除开不合理的方式,那么就只剩两种有序的存储方式了:①大端模式、②小端模式。

  那接下来如何证明具体是哪一种模式呢?以下面为例:

	int a = 1;
	//00000000 00000000 00000000 00000001

通过内存监视窗口我们发现 a在内存中是这样存储的:

 当然我们也可以根据大小端的概念实现检测:由以下代码,实现访问a的地址的第一个字节,由结果可知,第一个字节存的是1,也就是小端存储模式


三、整型在内存中的存储

1、原码、补码、反码 

①计算机中的整数有三种 2 进制表示方法,即原码、反码和补码。
②三种表示方法均有 符号位 数值位 两部分,符号位都是用 0 表示 ,用 1 表示 ”。

正数:原码、补码、反码 相同
负数:原码、反码、补码要进行计算

           (其中:原码:直接将数值按照正负数的形式翻译成二进制就可以得到原码。

                         补码:将原码的符号位不变,其他位依次按位取反就可以得到反码。

                         反码:反码+1就得到补码。

⑤整数在在内存中存储的是<补码>的二进制序列

#include <stdio.h>
int main()
{
	int a = -10;//4个字节,32位
//原码:10000000 00000000 00000000 00001010
//        第一位为符号位,其余为数值位
//反码:11111111 11111111 11111111 11110101
//补码:11111111 01111111 11111111 11110110 ---(内存中存的这个)

	unsigned int b = -10;
//补码:11111111 01111111 11111111 11110110

//全是有效位,没有符号位
}

2.整型练习

了解了整型在内存中的存储后,不妨做下面一道练习题:请猜测打印结果!

int main()
{
	char a = -1;
	//10000000 00000000 00000000 00000001
	//11111111 11111111 11111111 11111110
	//11111111 11111111 11111111 11111111
	//11111111  -  a

	signed char b = -1;
	//11111111  -  b

	unsigned char c = -1;
	//11111111  -  c
	//
	printf("a=%d,b=%d,c=%d", a, b, c);

	//%d 是10进制的形式打印有符号的整数(此处存在整形提升)
	//11111111111111111111111111111111 -  a
	//11111111111111111111111111111111 -  b	
	//00000000000000000000000011111111 -  c 
	//  
	return 0;

}

实际上,上述代码运行结果为:a=-1,b=-1,c=255  你算对了吗?


四、浮点数在内存中的存储

1.浮点数的表示方法

国际标准IEEE(电气电子工程师学会)754规定,任意一个浮点数 V 都能以下面这种方式表示:

V = (-1)^S * M * 2^E
其中:
①(-1)^S 表示符号位,当 S=0,V为正数;当S=1,V为负数。
②M表示有效数字,其中 1<=M<2
③2^E 表示指数位。其中 E是一个无符号整数(unsigned int)

例如:

十进制的5.0,写成二进制是101.0,相当于1.01×2^2。其中:S=0M=1.01E=2

十进制的 -5.0 ,写成二进制是 - 101.0 ,相当于 - 1.01×2^2 。那么, S=1 M=1.01 E=2

另外:

IEEE规定:对于32位的浮点数,最高的1位是符号位s,接着的8位是指数E,剩下的23位为有效数字M

 而对于64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M

 2.有效数字M和指数E-----特别规定。

(1)M

因为1<=M<2,故M可以写成 1.xxxxxx 的形式,其中xxxxxx表示小数部分。

IEEE 754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的 xxxxxx部分。

比如保存1.01的时 候,只保存01,等到读取的时候,再把第一位的1加上去。这样做的目的,是节省1位有效数字。以32位浮点数为例,留给M只有23位, 将第一位的1舍去以后,等于可以保存24位有效数字。


(2)E不全为0或不全为1

这时,浮点数就采用下面的规则表示,即指数 E 的计算值减去 127 (或 1023 ),得到真实值,再将
有效数字 M 前加上第一位的 1
比如:
0.5 1/2 )的二进制形式为 0.1 ,由于规定正数部分必须为 1 ,即将小数点右移 1 位,则为
1.0*2^(-1) ,其阶码为 -1+127=126 ,表示为
01111110 ,而尾数 1.0 去掉整数部分为 0 ,补齐 0 23 00000000000000000000000 ,则其二进
制表示形式为 :

 (3)E全为0

(4)E全为1 

这时,如果有效数字 M 全为 0 ,表示 ± 无穷大(正负取决于符号位 s );

3.浮点数例题

请给出下列代码的运行结果:

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;
}

公布答案:你想对了吗?

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值