C语言数据在内存中的存储

【C语言回顾】数据在内存中的存储 各位小伙伴大家好!上期小编给大家讲解了C语言中的字符函数、字符串函数,内存函数,接下来我们讲解一下数据在内存中的存储!在C语言中,数据在内存中的存储方式受到数据类型、对齐规则和编译器实现的影响。数据类型大小:C语言中的基本数据类型(如intcharfloatdouble等)在内存中占用的字节数是由编译器和目标系统架构决定的。例如,在32位系统中,int通常占用4个字节,float占用4个字节,而double占用8个字节。内存对齐:为了提高内存访问效率,C语言在存储数据时通常会遵循特定的对齐规则。 阅读详情

目录

1. 整数在内存中的存储

2. ⼤⼩端字节序和字节序判断

2.1什么是大小端         

2.2类型提升

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

3.1浮点数的存储

 3.1.1浮点数存的过程

3.1.2浮点数取得过程

3.2题目解析


1. 整数在内存中的存储

        整数的2进制表⽰⽅法有三种,即 原码、反码和补码。 

        有符号的整数,三种表⽰⽅法均有符号位和数值位两部分,符号位都是⽤0表⽰“正”,⽤1表⽰“负”,最⾼位的⼀位是被当做符号位,剩余的都是数值位。

        原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。

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

        补码:反码+1就得到补码。
        对于整型来说:数据存放内存中其实存放的是补码。 原因在于,使用补码可以将符号位和数值域统一处理,同时,加法和减法也可以同一处理(CPU只有加法器),此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

2. ⼤⼩端字节序和字节序判断

        我们先调试一个程序:

#include <stdio.h>

int main()
{
    int a = 0x11223344; //十六进制数
    
    return 0;
}

        我们可以看到这个数字是按照字节为单位倒着存储的。

2.1什么是大小端         

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

        ⼩端(存储)模式:是指数据的低位字节内容保存在内存的低地址处,⽽数据的⾼位字节内容,保存在内存的⾼地址处。

        上述地址的表示是左边为低地址,右边为高地址,左边存储的是低位字节,右边存储的是高位字节,所以在这台电脑上的存储方式是小端存储。一般情况下,倒着存储就是小端存储,正着存储就是大端存储。

        一行显示一个字节时如下:

        我们常⽤的 X86 结构是⼩端模式,⽽KEIL C51 则为⼤端模式。很多的ARM,DSP都为⼩端模式。有些ARM处理器还可以由硬件来选择是⼤端模式还是⼩端模式。

        设计一个小程序判断当前机器的字节序。

#include <stdio.h>

int check_sys()
{
    int i = 1;
    return (*(char*)&i); //对整型i先取地址存储指针变量中,在将指针变量强转成char*之后解引用。
}                        //强转为char类型之后,变量i中存储则低位字节的内容

int main()
{
    int ret = check_sys();
    if (ret == 1)
    {
         printf("小端\n");   
    }
    else
    {
        printf("大端\n");    
    }

    return 0;
}

2.2类型提升

//char类型到底是有符号的char还是无符号的char是取决于编译器的
//在VS上char == signed char

#include <stdio.h>

int main()
{
    char a = -1;

    //以32为机器为例
    //-1的原码--10000000000000000000000000000001
    //-1的反码--11111111111111111111111111111110
    //-1的补码--11111111111111111111111111111111(-1的补码是全1)
    //因为是char类型,所以存入一个字节中要发生截断,取后八位

    //所以在a里面存储的是--11111111
    // 类型提升后打印时为--11111111111111111111111111111111 -- 对应十进制为-1

    signed char b = -1;
    //  同理b里面存储的是--11111111
    // 类型提升后打印时为--11111111111111111111111111111111 -- 对应十进制为-1

    unsigned char c = -1;
    //无论是什么类型,补码都不变
    //      c里面存储的是--11111111
    // 类型提升后打印时为--00000000000000000000000011111111 -- 对应十进制为255

    //如何看里面存储的是多少时与类型有关
    printf("a=&d, b=%d, c=%d", a, b, c);
    //以%d的形式打印时打印的是有符号的整型(4个字节),打印之前要发生类型提升
    //类型提升,如果类型是有符号类型,高位补符号位,如果类型是无符号类型,高位补0.
}

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

        浮点数家族包括:float, double, long double等类型。浮点数表示的范围:float.h中定义。

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

        数据以整型存储之后以整型类型打印和数据以浮点型存储之后以浮点型类型打印都能得到正确的值,但是换了类型打印不能得到正确的值,说明了在内存中整型和浮点型的存储方式是不一样的。 

3.1浮点数的存储

 举例来说:
        十进制的5.0,写成二进制是101.0,相当于1.01*2^2。

        那么按照上面的格式可以得出,S=0,M=1.01,E=2。

 3.1.1浮点数存的过程

        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为一个无符号整型,这意味着,如果E为8位,取值范围为0-255,如果为11位,取值范围为0-2047。但是科学计数法中的E是可以出现负数的,所以IEEE 754规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,中间数是127;对于11位的E,中间数是1023。比如,2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001。

3.1.2浮点数取得过程

指数E从内存中取出还可以再分成三种情况:
(1)E不全为0或不全为1

        这时,浮点数就采用下面得规则表示,即指数E得计算值减去127(或1023),得到真实值,再将有效数字M前加上第一位的1。

比如:0.5的二进制形式为0.1,由于规定正数部分必须为1,即将小数点右移1位,则为1.0*2^(-1),其阶码为-1+127=126,表示为01111110,而尾数1.0去掉整数部分为0,补齐0到23位,则其二进制表示形式为:0 01111110 00000000000000000000000.

(2)E全为0

        这时,浮点数的指数E等于1-127(或1-1023)即为真实值,有效数字M不在加上第一位的1(所以指数E多了一个1),而是还原为0.xxxxxx的小数。这样这个数是一个接近于0的很小的数字。比如:0 00000000 00100000000000000000000.

(3)E全为1

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

         比如: 0 11111111 00100000000000000000000.

        注:E全为0和全为1的情况很少,仅仅作为了解.

3.2题目解析

回到上述的那段代码:

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

        为什么还原成浮点数,成了0.000000?
        9以整型的形式存储在内存中,得到如下二进制序列:

        则以浮点数的形式打印时:s=0, E=00000000, M=00000000000000000001001。由于指数E全为0,所以是一个接近0的很小的数字,打印出来就是0.000000.

        浮点数9.0,为什么整数打印是109156 7616?

        首先浮点数9.0的二进制为1001.0,即为1.001*2^3.s=0,M=001,E等于3+127=130,即10000010.写成二进制形式应该是S+E+M:

        这个32位的二进制数被当作整型来打印的时候,就是整型在内存中的补码,打印出来就是1091567616. 

        

C语言——整型数据在内存中的存储 整型数据的存储,整型提升的一些应用场景, 阅读详情

相关推荐

【Shader】Unity批量更换Shader

在Unity开发中,因为渲染管线问题,经常会遇到需要大量更改shader的问题,本篇文章讲述批量更换Shader的工具。

憨辰 1466

C语言——数据在内存中的存储

但是在C语言中除了8 bit的char之外,还有16 bit的short型,32 bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题:因此就导致了大端存储模式和小端存储模式。同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。这时,浮点数就采用下面的规则表示,即指数E的计算值减去127(或1023),得到真实值,再将。

有时间要学习的博客 1070

用AI免费制作30分钟电影:完整工作流与实操解析

AI视频生成技术正大幅降低影视创作门槛,但真正制作一部完整电影并非一键生成,而是涉及剧本、分镜、画面、配音、剪辑的复杂流水线。理解其基本原理,是将文本转化为连续视觉叙事的关键。对于创作者而言,掌握角色一致性控制、素材批量管理、免费额度合理分配等技术价值,能有效避免生成结果崩坏与资源浪费。该能力可广泛应用于短视频创作、独立电影预演、教学演示等场景。本文以30分钟AI电影制作为例,拆解从工具选择到成片输出的全流程,重点分析免费方案下的时间与积分成本,以及最容易翻车的环节,并给出基于实践验证的排查与优化策略。

weixin_29056865的博客 327

数据在内存中的存储<C语言>

在计算机中不同类型的数据在计算机内部存储形式各不相同,弄懂各种数据在计算机内部存储形式是有必要的,C语言的学习不能浮于表面,更要锻炼我们的“内功”,将来在写程序的时候遇见各种稀奇古怪的bug时,也便能迎刃而解,所以本文将着重介绍,整数在内存中的存储、大小端字节序和判断、浮点数的存储。

hukang的博客 3483

SRAM Bank数量配置:性能、面积与功耗的权衡指南

SRAM(静态随机存取存储器)是芯片设计中的关键存储单元,其Bank数量配置直接影响访问延迟、吞吐率、功耗和面积。Bank切分通过将存储阵列分区,缩短位线和字线延迟,从而提升性能,但会增加外围电路开销。合理配置Bank数量可优化PPA(性能、功耗、面积),在28nm和16nm工艺下,2个Bank通常是性价比最高的选择。本文基于实测数据,探讨不同场景下的Bank配置策略,帮助工程师避免常见误区,提升设计效率。

weixin_27230891的博客 179

CSI Tools 工具的安装 Intel 5300 + Ubuntu14.04

在 ubuntu14 系统上面安装 CSI Tools,2020最新教程,亲测可用,只要保证和我做法一致绝对可以安装好。

WS的小屋 1万+

【C语言】数据在内存中的存储

本文深入解析了C语言中数据存储的核心机制。整数存储采用补码形式,解决了符号位运算问题,实现了减法统一加法运算;大小端字节序决定了多字节数据的存储顺序,影响跨平台兼容性;浮点数采用IEEE 754标准,通过科学计数法实现高效存储。文章通过代码示例和调试分析,展示了如何判断字节序、处理类型转换异常等问题,帮助开发者深入理解内存存储原理,提升程序正确性和跨平台兼容性。掌握这些底层知识对解决内存异常、优化程序性能具有重要意义。

2301_78257800的博客 1803

全志V3S嵌入式驱动开发(驱动开发准备)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 之前的文章都是教大家怎么搭建环境、看原理图、编译内核和根文件系统、做镜像,直到现在才进入驱动开发的主题。毕竟整个专栏的目的,还是希望大家能够学会驱动外部硬件。驱动好硬件,分成硬件和软件两个部分,硬件的部分比较好理解,就是看相关的信号有没有对接上即可,但是软件对接、甚至于怎么写软件,大家好像接触的比较少,所以这个时候,就可以简单讨论一下,怎么样才能写驱动代码。 1、了解外部驱动芯

嵌入式-老费,一个分享专业嵌入式知识的blog 2025

【C语言】数据在内存中的存储(万字解析)

大端存储模式:是指数据的低位字节内容保存在内存的⾼地址处,⽽数据的⾼位字节内容,保存在内存的低地址处小端存储模式:是指数据的低位字节内容保存在内存的低地址处,⽽数据的⾼位字节内容,保存在内存的⾼地址处是不是有点懵,我们就以上面的那个图来举个例子,来说明什么是低位字节内容,哪里又是低地址:在这里我们可以看出,VS是把高字节数据放在了高地址,把低字节数据放在了低地址处,所以VS中采用了小端字节序的存储方式。

hdxbufcbjuhg的博客 3712

ConvNeXt 改进 :ConvNeXt添加GnConv递归门控卷积,二次创新CNBlock结构 ,独家首发

视觉 Transformer 在多种任务中取得了显著的成功,这得益于基于点积自注意力的新空间建模机制。视觉 Transformer 中的关键因素——即输入自适应、长距离和高阶空间交互——也可以通过卷积框架高效实现。作者提出了递归门控卷积(Recursive Gated Convolution,简称 gnConv),通过门控卷积和递归设计执行高阶空间交互。该新操作具有高度的灵活性和可定制性,兼容各种卷积变体,并将自注意力中的二阶交互扩展到任意阶数,而不会引入显著的额外计算。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 235

2024年CSP-X复赛真题题解(T1:购物)

2024年CSP-X复赛真题题解(T1:购物)

王老师青少年编程 1180

【C 语言进阶】剖析 C 语言数据在内存中的存储

文章目录1. 数据类型回顾内置类型意义基本分类2. 整型在内存中的存储介绍原码、反码、补码用补码存储的原因3. 大小端字节序介绍分类原因4. 习题补充5. 浮点型在内存中的存储介绍相关资料存储模型相关规定存储方式读取内存方式6. 总结 1. 数据类型 回顾内置类型 char //字符数据类型 short //短整型 int //整型 long //长整型 long long //更长的整型 float //单精度浮点型 double //双精度浮点型 意

吞吞吐吐大魔王的博客 3062

orangepi香橙派用户名及密码修改和VNC远程登陆

1、修改 /etc/passwd用户信息文件 vim /etc/passwd #admin❌503:501::/home/admin:/bin/bash #把用户名admin改成rest #test❌503:501::/home/test:/bin/bash 2、修改 /etc/shadow用户密码文件 vim /etc/shadow #admin:Dnakfw28zf38w:8764:0:168:7::: #由于密码加密方式存放,只修改用户名即可(密码不变) #test:Dnakfw28zf38w:876

weixin_40227845的博客 5663

【c语言】数据在内存中的存储

最近在复习C语言,发现深入剖析数据在内存中的存储这个问题,可以帮助我理解很多原来学过的计算机组成原理的知识(eg.原码反码补码大小端存储~之类的知识hhh)有一种打通任督二脉的感觉哈哈哈。第一遍理解个过程中,觉得知识过于杂乱,所以前来做个小总结!说起数据类型我们大致可以归类为:整型、浮点型、构造类型、指针类型、空类型。本文主要探讨整形、浮点型在内存中的存储形式。前提我们要知道:计算机能够处理的是二进制数据,整型和浮点型数据在内存中也都是以二进制进行存储的。明白数据在内存中的存储形式到底是为了什么呢?

烧鸡配油茶的博客 1903

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

[C语言]数据在内存中的存储

在讲解操作符的时候,我们就讲过了下⾯的内容:整数的2进制表⽰⽅法有三种,即原码、反码和补码。有符号的整数,三种表⽰⽅法均有符号位和数值位两部分,符号位都是⽤0表⽰“正”,⽤1表 ⽰“负”,最⾼位的⼀位是被当做符号位,剩余的都是数值位。正整数的原、反、补码都相同。负整数的三种表⽰⽅法各不相同。直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。将原码的符号位不变,其他位依次按位取反就可以得到反码。反码+1就得到补码。

2302_81083101的博客 876

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

C语言:数据在内存中的存储形式

我们以整型在内存中的存储形式为基础,探究后面的内容:整型提升与截断、算数转换、大小端字节序和字节序判断、强制类型转换的原理、浮点数在内存中的存储、signed char和unsigned char的取值范围!!

weixin_51142926的博客 1万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

[C 语言篇】数据在内存中的存储

内存,全称为内存储器(Internal Memory),是计算机中用于暂时存储正在运行的程序和数据的部件。它就像是计算机的 “临时仓库”,当我们运行一个 C 语言程序时,程序的代码以及程序中所使用的数据都会被加载到内存中,CPU 会从内存中读取指令和数据进行处理,然后再将处理结果写回内存。内存的读写速度比外部存储设备(如硬盘、U 盘等)要快得多,这使得计算机能够快速地处理各种任务。大小端模式是指数据在内存中存储时字节顺序的不同方式。小端模式(Little - Endian)

不头冷,无程序 1024
上一篇: C语言内存函数
下一篇: C语言中的自定义类型-- 结构体、内存对齐,结构体大小计算,位段,联合体,联合体大小计算,枚举
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值