网站维护的意义,微信小商店怎么分销,pageadmin 制作网站怎么绑定域名,嘉兴网站建设一薇目录 前言#xff1a;
一.数据类型介绍 类型基本归类#xff1a;
整型家族#xff1a;
浮点数家族#xff1a;
构造类型#xff1a;
指针类型#xff1a; 空类型#xff1a; 二.整型在内存中的存储
1.原码#xff0c;反码#xff0c;补码
2.大小端介绍
3.练…目录 前言
一.数据类型介绍 类型基本归类
整型家族
浮点数家族
构造类型
指针类型 空类型 二.整型在内存中的存储
1.原码反码补码
2.大小端介绍
3.练习巩固
三.浮点型数据的存储
1.浮点数存储与整型存储的关系
2.浮点数存储规则
3.IEEE 754对有效数字M和指数E还有一些特别规定。
4.指数E 前言 介绍整型和浮点型数据类型在内存中的存储,希望对你有所帮助。 一.数据类型介绍
整数类数据类型只表示整数
浮点型可表示具有小数部分的数值 以上类型又被叫做算术类型。
注意C语言中没有字符串类型
那么为什么在编程语言中要区分数据类型呢 1.使用这个类型开辟内存空间的大小(大小决定了使用范围)。 2.如何看待内存空间的视角 类型基本归类
整型家族 浮点数家族 构造类型 指针类型 空类型 二.整型在内存中的存储
一个变量的创建是要在内存中开辟空间的。空间的大小是根据不同的类型而决定的。 我们来看看数据在所开辟内存中到底是如何存储的 我们知道int整型在32位环境下占用四个字节大小那该如何存储呢
我们首先来了解如下概念
1.原码反码补码 计算机中的整数有三种2进制表示方法即原码、反码和补码。 三种表示方法均有符号位和数值位两部分符号位都是用0表示“正”用1表示“负”而数值位正数的原、反、补码都相同。 负整数的三种表示方法各不相同。 对于整形来说数据存放内存中其实存放的是补码。 在计算机系统中数值一律用补码来表示和存储。原因在于使用补码可以将符号位和数值域统 一处理 同时加法和减法也可以统一处理CPU只有加法器此外补码与原码相互转换其运算过程 是相同的不需要额外的硬件电路。
让我们来看看内存中如何存放的数据。 我们可以看到对于a和b分别存储的是补码。但是我们发现顺序有点不对劲。
这又是什么原因呢
2.大小端介绍
什么是大端小端 大端存储模式是指数据的低位保存在内存的高地址中而数据的高位保存在内存的低地址 中 小端存储模式是指数据的低位保存在内存的低地址中而数据的高位,保存在内存的高地 址中。 大端存储相当于正着放置数据 小端存储是逆着放置数据 注意我们是通过十六进制来表示的数据在内存中查看的也是十六进制表示的数据
我们下面通过一个代码来检测我当前使用的VS2022环境下是大端还是小端存储
#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;
}运行发现 由此可见我们的VS2022使用的是小端存储。
数据存储的一种循环理解我们以char类型来解释 3.练习巩固
#include stdio.h
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;
}运行可得 如下分析
a-1的原码反码补码如下 a的补码在存储时char类型会发生截断变为 当还原为原码时步骤如下符号位置不变其他位按位取反得到反码后再加一 可知1000001二进制表示的就是-1
b为有符号整型可同理得出打印数据和存储数据一致
b-1的原码反码补码如下 那为什么c却是255呢
原因如下 这就是数据在内存中存储方式因为数据类型不同而导致的。因此区分和正确使用数据类型十分的重要
下面的一些练习可以帮助你加深对数据存储的理解 #include stdio.h
int main()
{char a -128;printf(%u\n,a);return 0;
}/*输出一个特别大的数字首先a是有符号char类型的变量,存储-128的值,而%u是打印无符号整数的意思,所以这里的char类型会发生整型提升,从一个字节提升至4个字节,又因为a是负数,它的的符号位为1,所以整型提升时前面全部都是补的1,所以我们就得到了一个数的补码,而无符号数的源反补码都相同,所以我们就会得到一个特别大的数的源码.*/
#include stdio.h
int main()
{char a 128;printf(%u\n,a);return 0;
}#includestdio.h
int main()
{char a[1000];int i;for(i0; i1000; i){a[i] -1-i;}printf(%d,strlen(a));return 0;
}
#include stdio.h
unsigned char i 0;
int main()
{for(i 0;i255;i){printf(hello world\n);}return 0;
}三.浮点型数据的存储
1.浮点数存储与整型存储的关系
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 在内存中明明是同一个数为什么浮点数和整数的解读结果会差别这么大 这就是因为浮点数和整型数据在内存中存储的方式不同而造成的。
2.浮点数存储规则 要理解这个结果一定要搞懂浮点数在计算机内部的表示方法。 详细解读 根据国际标准IEEE电气和电子工程协会 754 任意一个二进制浮点数V可以表示成下面的形式 (-1)^S * M * 2^E(-1)^S表示符号位当S0V为正数当S1V为负数。M表示有效数字大于等于1小于2。2^E表示指数位。 举例来说 十进制的5.0写成二进制是 101.0 相当于 1.01×2^2 。
那么按照上面V的格式可以得出S0M1.01E2。
十进制的-5.0写成二进制是 -101.0 相当于 -1.01×2^2 。
那么S1M1.01E2。 相当于所有的浮点数都可以用S,M,E这三个数表示出来,所以我们的内存中只需要存储这三个数即可代表浮点数。 对于64位的浮点数最高的1位是符号位S接着的11位是指数E剩下的52位为有效数字M。 3.有效数字M的特别规定。 前面说过 1≤M2 也就是说M可以写成 1.xxxxxx 的形式其中xxxxxx表示小数部分。 IEEE 754规定在计算机内部保存M时默认这个数的第一位总是1因此可以被舍去只保存后面的 xxxxxx部分。比如保存1.01的时 候只保存01等到读取的时候再把第一位的1加上去。这样做的目的是节省1位有效数字。以32位 浮点数为例留给M只有23位 将第一位的1舍去以后等于可以保存24位有效数字。 4.指数E的特别规定 1. E不全为0或不全为1 这时浮点数就采用下面的规则表示即指数E的计算值减去127或1023得到真实值再将 有效数字M前加上第一位的1。 比如 0.51/2的二进制形式为0.1由于规定正数部分必须为1即将小数点右移1位则为 1.0*2^(-1)其阶码为-1127126表示为 01111110而尾数1.0去掉整数部分为0补齐0到23位00000000000000000000000则其二进 制表示形式为:0 01111110 00000000000000000000000 2. E全为0 这时浮点数的指数E等于1-127或者1-1023即为真实值 有效数字M不再加上第一位的1而是还原为0.xxxxxx的小数。这样做是为了表示±0以及接近于 0的很小的数字。 3. E全为1 这时如果有效数字M全为0表示±无穷大正负取决于符号位s。 本章内容较多需要多花功夫加深理解。感谢支持。