c语言-数据在内存中的存储

这篇具有很好参考价值的文章主要介绍了c语言-数据在内存中的存储。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


1. 整数在内存中的存储

1.整数的2进制表示方法有三种,即 原码、反码和补码
2. 三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位最高位的一位是被当做符号位,剩余的都是数值位。
3. 存储时存储的是补码,取出的时取出的原码

如:
c语言-数据在内存中的存储,c语言主要知识点,c语言,开发语言,笔记,操作符,整形提升,存储
正负数的原码、反码、补码转换

正整数的原、反、补码都相同。
负整数的三种表示方法各不相同。 原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。 反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。 补码:反码+1就得到补码。
补码转换原码,将上述过程反过来即可 :补码-1得到反码,反码符号位不变,其他位依次按位取反就可以得到原码了

如,存储int类型 -1,和1
c语言-数据在内存中的存储,c语言主要知识点,c语言,开发语言,笔记,操作符,整形提升,存储

对于整形来说:数据存放内存中其实存放的是补码。

为什么呢?
在计算机系统中,数值⼀律用补码来表⽰和存储。
原因在于,使用补码,可以将符号位和数值域统⼀处理;同时,加法和减法也可以统⼀处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

无符号类型:
即将符号位去掉,将所有位当数值位
c语言-数据在内存中的存储,c语言主要知识点,c语言,开发语言,笔记,操作符,整形提升,存储
无符号位的原码、反码、补码相同
如:unsigned int 1 、-1
c语言-数据在内存中的存储,c语言主要知识点,c语言,开发语言,笔记,操作符,整形提升,存储

2. 大小端字节序和字节序判断

什么是大小端?

其实超过⼀个字节的数据在内存中存储的时候,就有存储顺序的问题,按照不同的存储顺序,我们分
为大端字节序存储和小端字节序存储,下面是具体的概念:
大端(存储)模式:是指数据的低位字节内容保存在内存的⾼地址处,而数据的⾼位字节内容,保存 在内存的低地址处。
小端(存储)模式:是指数据的低位字节内容保存在内存的低地址处,而数据的⾼位字节内容,保存 在内存的高地址处。

为什么有大小端?

这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着⼀个字节,⼀个字节为8 bit 位,但是在C语⾔中除了8 bit 的> char 之外,还有16 bit 的 short 型,32 bit 的 long 型(要看 具体的编译器),另外,对于位数⼤于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度⼤ 于⼀个字节,那么必然存在着⼀个如何将多个字节安排的问题。因此就导致了⼤端存储模式和⼩端存 储模式。
例如:⼀个 16bit 的 short 型 x ,在内存中的地址为 0x0010 , x 的值为 0x1122 ,那么 0x11 为⾼字节, 0x22 为低字节。对于⼤端模式,就将0x11 放在低地址中,即 0x0010 中, 0x22 放在高地址中,即 0x0011 中。小端模式,刚好相反。我们常⽤的 X86结构是小端模式,⽽ KEIL C51 则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。

例:
如何存储0x11223344

int main() {
	int a = 0x11223344;
	return 0;
}

c语言-数据在内存中的存储,c语言主要知识点,c语言,开发语言,笔记,操作符,整形提升,存储
练习:
设计⼀个小程序来判断当前机器的字节序

1.大端和小端的区别在于存储的字节序
2.我们只需要取低地址的一个字节就可以观察是大端还是小端了

代码实现:

#include <stdio.h>
int check_sys()
{
 int i = 1;//设置i=1,只观察第一个字节
 return (*(char *)&i);//强制类型将&i转为char*(为了只取第一个字节),再解引用得到第一个字节的内容
}
int main()
{
 int ret = check_sys();//调用函数,看返回值
 if(ret == 1)
 {
 printf("⼩端\n");
 }
 else
 {
 printf("⼤端\n");
 }
 return 0;
 }

3. 浮点数在内存中的存储

**1.常见的浮点数:**3.14159、1E10等,浮点数家族包括: float、double、long double 类型。
浮点数表示的范围: float.h 中定义

2.浮点数的存储
根据国际标准IEEE(电气和电子工程协会) 754,任意⼀个⼆进制浮点数V可以表示成下面的形式:
V = (−1) ∗ S M ∗ 2E
• (−1)S 表示符号位,当S=0,V为正数;当S=1,V为负数
• M 表示有效数字,M是大于等于1,小于2的
• 2^E 表示指数位
举例来说:
c语言-数据在内存中的存储,c语言主要知识点,c语言,开发语言,笔记,操作符,整形提升,存储

IEEE 754规定:

对于32位的浮点数,最高的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M
对于64位的浮点数,最高的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M

float类型浮点数内存分配
c语言-数据在内存中的存储,c语言主要知识点,c语言,开发语言,笔记,操作符,整形提升,存储

double类型浮点数内存分配
c语言-数据在内存中的存储,c语言主要知识点,c语言,开发语言,笔记,操作符,整形提升,存储

3. 浮点数存的过程
IEEE 754 对有效数字M和指数E,还有⼀些特别规定。

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

至于指数E,情况就比较复杂

首先,E为⼀个无符号整数(unsigned int)
这意味着,如果E为8位,它的取值范围为0-255;如果E为11位,它的取值范围为0~2047。但是,我们知道,科学计数法中的E是可以出现负数的,所以IEEE
754规定,存⼊内存时E的真实值必须再加上⼀个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。比如,2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001。

我们将上述例子存储起来:
假设5.5是float类型
c语言-数据在内存中的存储,c语言主要知识点,c语言,开发语言,笔记,操作符,整形提升,存储
M的首位可以省略掉,存储小数点后面的数即可
4.浮点数取的过程

S ->判断正负
M->按存储时候的顺序取出,并前面加1,如上面的例子:.011,然后再在前面加1->M=1.011
指数E从内存中取出还可以再分成三种情况:
E不全为0或不全为1
这时,浮点数就采用下面的规则表示,即指数E的计算值减去127(或1023),得到真实值,再将有效 数字前加上第⼀位的1。 比如:0.5 的⼆进制形式为0.1,由于规定正数部分必须为1,即将小数点右移1位,则为1.0*2^(-1),其 阶码为-1+127(中间值)=126,表示为01111110,而尾数1.0去掉整数部分为0,补齐0到23位
00000000000000000000000,则其⼆进制表示形式为:0 01111110 00000000000000000000000
E全为0
这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,有效数字M不再加上第⼀位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0,以及接近于0的很小的数字。 如:0 0000000000100000000000000000000
E全为1
这时,如果有效数字M全为0,表⽰±⽆穷⼤(正负取决于符号位s) 如:0 11111111 00010000000000000000000

5.精度问题
在存储一个浮点数时,由于存储的比特位是有限的,fioat-23位,double-52位,一旦超过这个位数就会出现精度丢失的问题
如:打印99.7时

int main() {
	float a = 99.7;
	printf("%f", a);
	return 0;
}

运行结果:
c语言-数据在内存中的存储,c语言主要知识点,c语言,开发语言,笔记,操作符,整形提升,存储
丢失了一些数据。
总结:

(1)有些浮点数在内存中无法精确保存
(2)double精度一定比float的高
(3)浮点数在比较时可能会出现问题

练习:

#include <stdio.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;}

输出的结果是什么?
c语言-数据在内存中的存储,c语言主要知识点,c语言,开发语言,笔记,操作符,整形提升,存储

解析:
c语言-数据在内存中的存储,c语言主要知识点,c语言,开发语言,笔记,操作符,整形提升,存储

以上就是我的分享了,如果有什么错误,欢迎在评论区留言。
最后,谢谢大家的观看!文章来源地址https://www.toymoban.com/news/detail-756513.html

到了这里,关于c语言-数据在内存中的存储的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [知识点整理]中科院/国科大 自然语言处理nlp 期末考试知识点整理

    本文为2022秋网安学院的自然语言处理课程期末复习知识点整理,水平有限,整理的答案可能有错误或遗漏,欢迎大家指正。 文章的第二部分内容参考了学校学姐的文章,文章写的很好,大家可以关注她: (133条消息) 【一起入门NLP】中科院自然语言处理期末考试*总复习*:考

    2024年02月09日
    浏览(50)
  • 8086 汇编语言知识点梳理

    机器语言是机器指令的集合 机器指令是一台机器可以正确执行的命令 机器指令由一串二进制数表示 汇编语言的主体是汇编指令 汇编指令是机器指令便于记忆的书写格式 汇编指令是机器指令的 助记符 汇编指令:机器码的助记符,有对应的机器码 伪指令::没有对应的机器

    2024年02月08日
    浏览(53)
  • 计算机语言知识点梳理

    python是一门强类型、动态型、解释型语言语言 JavaScript是一门弱类型、动态性、解释型语言 typescript是一门强类型、静态型、编译型语言 Java是一门强类型、静态型、编译型语言 变量大小写区分 html css sql java javascript python typescript c 弱类型语言和强类型语言 强类型语言也称为强

    2024年02月09日
    浏览(48)
  • 监控技术栈中的知识点

    一、日志数据和指标数据怎么区别?   日志数据和指标数据是两种常用的监控数据。它们的区别主要体现在以下几个方面: 数据格式 :日志数据通常是文本格式的,而指标数据通常是数字格式的。 数据内容 :日志数据通常记录了系统或应用程序的运行状态,而指标数据通

    2024年02月07日
    浏览(47)
  • 【C语言】指针知识点笔记(2)

    目录 一、野指针 二、assert断言 三、指针的使用和传址调用 四、数组名的理解 五、使用指针访问数组

    2024年01月18日
    浏览(43)
  • QT C++ 中的重要知识点

    以下是一些 QT C++ 中的重要知识点: 1. 信号和槽机制 :QT C++ 中的信号和槽机制是一种事件处理机制,用于在对象之间传递消息。信号是一种特殊的函数,当特定事件发生时,它们被发射。槽是一种普通的函数,用于响应信号。通过连接信号和槽,可以实现对象之间的通信。

    2024年02月05日
    浏览(48)
  • 单片机----汇编语言入门知识点

    目录 汇编语句的格式 汇编语句的两个基本语句 子程序的调用 查表程序设计 1.x和y均为单字节数的查表程序设计 2.x为单字节数y为双字节数的查表程序设计 3.x和y均为双字节数的查表程序设计 分支转移程序设计 1.单分支选择结构 2.多分支选择结构 循环程序设计 (1) 计数循环控

    2024年04月28日
    浏览(48)
  • 【详解】C语言冷门知识点之--位段

    下面是维基百科对位段的解释:   位段(或称“位域”,Bit field)为一种数据结构,可以把数据以位的形式紧凑的储存,并允许程序员对此结构的位进行操作。这种数据结构的好处: 可以使数据单元节省储存空间,当程序需要成千上万个数据单元时,这种方法就显得尤为重

    2024年02月16日
    浏览(41)
  • Eplan使用过程中的知识点1

    一、新建时的几种标准模板 EPLAN中的符号库符合国际标准,分为单线图和原理图符号库。 符号库符合GB(国标)、IEC(国际标准)、NFPA(美国标准)和GOST(俄罗斯标准)4大标准。对应的4大标准的符号库分别为GB_symbol、IEC_symbol、NFPA_symbol、GOST_symbol。 二、EPLAN的系统主数据包

    2024年02月12日
    浏览(38)
  • C语言:数组、字符串知识点整理:

    补充 :数组长度= sizeof(arr)/sizeof(arr[0]) 注意: !!! 不适用于当arr 充当形参时(函数传参) !!! 因为函数 传递 的是 int arr[0] 的 地址(指针) ,而 不是数组内容 , 若在此情况计算整形数组长度         在X86系统下,指针大小为 4 ,所以计算结果为4/4=1;       

    2024年03月10日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包