C语言的数据存储详解

【异常】OpenClaw LLM请求超时异常LLM request timed out.的技术分析与解决方案 LLM请求超时是OpenClaw工程化落地中最常见的链路稳定性问题,排查处置需遵循标准化的分级流程。绝大多数场景可通过重试、调整超时配置、优化模型选型快速解决;针对顽固型异常,可通过全链路日志拆解超时阶段,精准定位根因并完成针对性修复,最终保障OpenClaw业务链路的稳定运行。 阅读详情

C语言数据存储

类型的基本归类

有无符号的意义:生活中有写数据是没有符号之分的,将最高位(即符号位)利用可以扩大范围

整形包含类型占用空间备注
charunsigned char1Byte字符的本质是ASCII值,是整形
signed char1Byte不同于直接创建 int a时,a为signed
char1Bytechar 到底是signed 还是 unsigned 标准是未定义的,取决于编译器(VS下为signed)
shortunsigned short (int)2Bytes
(signed) short (int)2Bytes
intunsigned int4Bytes
(signed) int4Bytes
longunsigned long (int)4/8BytesC语言在规定类型大小时,只规定了 sizeof(long) >= sizeof(int)
(signed) long (int)4/8Byteslong 在x86为4,x64为8
long longunsigned long long (int)8Byteslong long 为C99中引入
(signed) long long (int)8Bytes
浮点型占用空间备注
float4Bytesfloat 的精度低,存储范围小,double 精度高,范围大
double8Bytes
long double不定长度可能会应编译器和平台的不同而产生差异,可能和 double 一样长,可能更长(8/12/16Bytes)

long double 在 C99 标准中被引入,用以表示更高精度的浮点数

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

以及不同类型所对应的指针类型、空类型(void)

空类型常用于函数的返回类型(表示无返回)、函数的参数(无需参数)等

类型的意义

  • 不同的类型对应所开辟的内存空间大小不同(内存大小决定使用范围)
  • 程序看待对应内存空间的视角(程序以何种规则读取)

以下程序用于验证整形和浮点型的存取规则不同

#include <stdio.h>

int main()
{
    int n = 9;//开辟4bytes
    float* pFloat = (float*)&n;//把n的地址放到pfloat里面,实际还是指向那整形的4bytes

    printf("n的值为:%d\n", n);//9
    printf("*pFloat的值为:%f\n", *pFloat);//0.000000
    //这里按照浮点的规则取出数据,结果错误,说明整形和浮点的存储方式不同

    *pFloat = 9.0;
    printf("num的值为:%d\n", n);//1,091,567,616
    printf("*pFloat的值为:%f\n", *pFloat);//9.000000
    return 0;
}

数据在内存中的存储

整形在内存中的存储

整形表示的范围在limits.h中定义(如果不用到上限和下限的话不用引)

在这里插入图片描述

在这里插入图片描述

程序中整形的二进制表示方式有三种,分别为原码、反码和补码

  • 原码即为整数的二进制表示,对于有符号类型,最高位为符号位,0表示正数,1表示负数
  • 正数的三码相同
  • 负数的反码为原码按位取反(最高位不变),补码为反码加1

以7和-7为例(int)

整形表示方式数据
7原码00000000 00000000 00000000 00000111
反码00000000 00000000 00000000 00000111
补码00000000 00000000 00000000 00000111
-7原码10000000 00000000 00000000 00000111
反码11111111 11111111 11111111 11111000
补码11111111 11111111 11111111 11111001

在计算机系统中,数值一律用补码来表示和存储。通过补码,可以将负数视为正数,将加法和减法统一处理(CPU只有加法器)此外,补码与原码相互转换(补码的补码即为原码),其运算过程是相同的,不需要额外的硬件电路

int main()
{
    int a = 20;
    //原、反、补:00000000 00000000 00000000 00010100
    //    十六进制      00       00       00       14  (0x 00 00 00 14)

    int b = -10;
    //最高位为符号位
    //原:10000000 00000000 00000000 00001010
    // 0x 80       00        00         0a
    //反:11111111 11111111 11111111 11110101
    // 0x ff        ff        ff         f5
    //补:11111111 11111111 11111111 11110110
    // 0x ff        ff        ff         f6
    //对补码取反:
    //      10000000 00000000 00000000 00001001
    // +1:
    //      10000000 00000000 00000000 00001010 得到原码

    //20-10 = 20 + (-10)
    int c = a + b;
    //00000000 00000000 00000000 00010100
    //11111111 11111111 11111111 11110110
    //相加得到一个补码:
    //(1)00000000 00000000 00000000 00001010 最高位被丢掉
    //0x 00 00 00 0a  (10)
    return 0;
}
大小端

大小端即计算机系统中两种不同的数据存储方式

大端存储模式 将数据的低位保存在内存中的高位地址,将数据的高位保存在低位地址

小端存储模式 将数据的低位保存在内存中的低位地址,将数据的高位保存在高位地址

由于数据长度、寄存器大小不同,且计算机的存储是以字节为单位的,这就导致了不同长短的数据和寄存器(如16位、32位)之间存在数据存放的顺序问题(即哪些数据放在高地址,哪些放在低地址),大小端存储模式就是为了解决这类问题

我们常用的X86(x64) 结构是小端模式

这里以上面这段简单的代码为例,以下分别位a,b在内存中的存储

在这里插入图片描述

在这里插入图片描述

实际上,数据存储的规则可以是多种的,只要保证存入和取出的方式相同即可

浮点型同样有大小端,但对一个字节的数据,没有顺序可谈

//判断当前环境是大端还是小端
#include <stdio.h>
int check()
{
    int i = 1;
    return (*(char*)&i);
    //将地址强制转为char*,即只读取最低位的数据
    //当为小端,得到1;当为大端,得到0
}
int main()
{
    int ret = check();
    if (ret == 1)
    {
        printf("小端\n");
    }
    else
    { 
        printf("大端\n");
    }
    return 0;
}
整形提升和截断

截断发生在数据存储时,整形提升发生在使用时

有关整形提升和截断的内容,详见另一篇博客

C语言对类型的转换-优快云博客

#include <stdio.h>
int main()
{
    char a = -1;
    //char 在VS下是有符号的

    // -1 是整形,为32位,要存入char,要发生截断
    //原:10000000 00000000 00000000 00000001
    //反:11111111 11111111 11111111 11111110
    //补:11111111 11111111 11111111 11111111
    //发生截断
    // a -- 11111111
    // %d 打印有符号整形,发生整形提升,对于有符号数,高位补1
    // 11111111 11111111 11111111 11111111 -- 补码
    // 10000000 00000000 00000000 00000000 -- 取反
    // 10000000 00000000 00000000 00000001 -- +1 得到原码
    // b的打印同理
    // 截断和大小端无关,相当于是从内存中拿出数据后再发生截断

    signed char b = -1;

    unsigned char c = -1;
    //原:10000000 00000000 00000000 00000000
    //反:11111111 11111111 11111111 11111110
    //补:11111111 11111111 11111111 11111111
    // c -- 11111111
    //无符号数高位补0
    // 00000000 00000000 00000000 11111111 --- 直接就是原码

    printf("a=%d,b=%d,c=%d", a, b, c);
    //VS环境下打印  a=-1,b=-1,c=255
    return 0;
}

浮点型在内存中的存储

根据国际标准IEEE(电气和电子工程协会) 754 (即IEEE二进制浮点数算术标准),任意一个二进制浮点数V可以表示成下面的形式:

(-1)^S * M * 2^E

(-1)^s — 符号位,当s=0,V为正数;当s=1,V为负数

M — 有效数字,大于等于1,小于2

2^E — 指数位

6.0的二进制表示就是 110.0

s=0,M=1.1,E=2

即为1.1×2^2

6.5就是110.1

s=0, M=1.101,E=2

即为1.101×2^2

浮点型的存储规则

float - 4bytes - 32 bit

最高的1位是符号位s,接着的8位是指数E,剩下的23位为有效数字M

double - 8bytes - 64bit

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

根据十进制转换二进制的计算规则(小数部分×2取整,得0为止)可知,当一个数的小数部分在多次乘法取整后仍不为0时,可能会将有效数字所占长度全部使用,后面的数据将无法存储。即浮点数存在丢失精度的情况

IEEE 754规定,在计算机内部保存M时,默认的第一位总是1,因此可以被舍去,只保存后面的小数部分(即保留24/53位有效数字),由此可以提高精度

E为一个无符号整数(unsigned int),当8为8位时,其范围为0~255,而科学计数法中的指数可以存在负数,因此IEEE 754规定,存入内存时E的真实值必须再加上一个中间数,即加上127/1023

E的不同情况
  • E不全为0或不全为1

    此时,E的真实值计算即为(E-中间值)

  • E全为0

    E+127 = 0,这时,浮点数的指数E等于1-127(或者1-1023)即为真实值

    有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0,以及接近于

    0的很小的数字

  • E全为1

    E + 127 = 255

    这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s)即 1.xxxxxx * 2^128


运用

利用这些规则,分析上面的代码

#include <stdio.h>

int main()
{
    int n = 9;
    //00000000 00000000 00000000 00001001
    //0 00000000 00000000000000000001001
    //s=0 E=00000000

    float* pFloat = (float*)&n;

    printf("n的值为:%d\n", n);//9
    printf("*pFloat的值为:%f\n", *pFloat);//0.000000
    //0 00000000 0000000000 0000000001 001
    //s=0 E=00000000
    //一个接近0的很小的数


    *pFloat = 9.0;
    //9.0 --- 1001.0
    //s=0 E=3 --- 00000011
    // 3 + 127 = 130 --- 1000 0010
    //0 10000010 0010000000 0000000000 000
    printf("num的值为:%d\n", n);//1,091,567,616

    //01000001 00010000 00000000 00000000
    printf("*pFloat的值为:%f\n", *pFloat);//9.000000
    return 0;
}
STM32F407中文手册 STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。 立即下载

相关推荐

解析vCard 3.0:提取电子名片中的姓名

N:LastName;FirstName;;;END:VCARD和END:VCARD标记数据块的开始和结束。N字段存储结构化姓名(分号分隔)。FN字段为直接可读的显示名称。其他字段如TELEMAIL等保存联系信息。

qq_45797625的博客 2780

C语言数据的存储

C语言的内置类型char 字符数据类型 1字节(8bit位)short 短整型 2字节(16bit位)int 整型 4字节(32bit位)long 长整型 4/8字节long long 更长的整型 8字节float 单精度浮点型 4字节double 双精度浮点型 8字节。

qq_66238381的博客 2365

Dify + mem0插件实战:如何让AI记住你的饮食习惯(附完整代码)

本文通过Dify平台与mem0插件实战,详细演示了如何为AI助手构建长期记忆系统,使其能记住并理解用户的复杂饮食习惯(如过敏源、饮食偏好)。文章提供了完整的工作流配置与Python代码示例,帮助开发者实现跨会话的个性化饮食建议,解决AI对话中的“健忘”问题。

lg888的博客 1094

C语言:数据的存储

C语言:数据的存储

tydo达令的博客 2144

VN5620硬件接口介绍

VECTOR, VN5620, 诊断

Fecostar的博客 7484

Android - 蓝牙开发

文章目录科普SIG类型制式编程Classic BluetoothBluetooth Low Energy蓝牙的UUID是什么?有什么用? 科普 https://zh.wikipedia.org/wiki/%E8%97%8D%E7%89%99 蓝牙(英语:Bluetooth),一种无线通讯技术标准,用来让固定与移动设备,在短距离间交换资料,以形成个人局域网(PAN)。其使用短波特高频(UHF)无线电波,经由 2.4 至 2.485 GHz 的 ISM(工业、科学、医疗)频段来进行通信。1994 年由电信商

qq_43323826的博客 1万+

C语言中的数据存储

原码、反码、补码的概念只对负数有效,因为正数的原反补码相同。原码指的就是一个整数使用二进制表示的数字a 的值a = -18;此时 a 的原码就是1000 0000 0001 0010反码指的是在保持符号位不变,其他位数取反a 的值a = -18;此时 a 的反码是1111 1111 1110 1101补码在反码的基础上+1a 的值a = -18;此时 a 的补码是1111 1111 1110 1110。

qq_45286980的博客 239

相控阵多功能雷达工作模式识别技术综述

本文综述了相控阵雷达工作模式识别技术的研究进展。首先介绍了相控阵雷达的典型工作模式分类及其信号特征参数,包括搜索模式(VS、RWS、TWS)、跟踪模式(STT、MTT、TAS)和其他模式(SAM、SAR)等。随后重点阐述了基于信号特征的识别方法,包括时域特征(PRI分析、脉冲幅度包络、数据率)、频域特征(载频变化、调制方式)和混合特征分析方法。最后讨论了当前技术面临的挑战与发展趋势,包括复杂信号环境下的识别难题、新型雷达技术的适应需求以及深度学习技术的应用前景。该领域的研究对电子侦察和威胁评估具有重要意义。

Grow into a more wonderful you 1802

C语言—数据的存储(详解)

我们已经学习了基本的内置类型,以及它们所占储存空间的大小。类型的意义:1.使用这个类型开辟内存空间的大小(大小决定了使用范围)。2.如何看待内存空间的视角。char //字符数据类型short //短整型int //整形long //长整型long long //更长的整形float //单精度浮点数double //双精度浮点数。

2302_79054145的博客 1491

基于Simulink建模仿真的滑模控制的磁悬浮轴承稳定控制仿真

磁悬浮轴承(Magnetic Bearing)利用电磁力来支撑和定位转子,无需机械接触,因此在高速旋转设备中具有广泛应用。滑模控制(Sliding Mode Control, SMC)是一种鲁棒性强的非线性控制方法,适用于磁悬浮轴承的精确控制。以下是基于Simulink的磁悬浮轴承滑模控制系统的详细设计与仿真步骤。通过上述步骤,设计并实现了基于 Simulink 和 Control System Toolbox 的磁悬浮轴承滑模控制系统。

MHD0815的博客 780

【语音识别】基于MFCC特征实现说话人语音识别matlab源码

1 模型 采用能够反映人对语音的感知特性的Mel频率倒谱系数(MFCC)作为特征参数,以及为避免时间规整问题采用矢量量化技术开发的说话人识别系统.MFCC主要的是模拟人耳的听觉过程,相对于其它参数它对语音波形的变化不敏感,更加稳定,系统取得很好的识别结果,实验表明系统训练和识别的计算量和存储量都比较低. 2 部分代码 functionvarargout=Main(varargin) % MAIN M-file for Main.fig % MAIN, by itself...

qq_59747472的博客 848

C语言详解(数据存储)

数据存储

小羊的博客 2307

「JS逆向三百例」JS逆向HIKVISION-视频监控的前端密码加密

本文详细分析了HIKVISION-海康威视监控前端登录过程中密码的加密机制,通过逆向工程解析了其 JavaScript 加密逻辑,重点研究了HIKVISION-海康威视监控的前端密码SHA256加密算法的实现。基于逆向分析结果,使用 Python 模拟了HIKVISION-海康威视监控的登录流程,最终实现了自动化登录功能。本文旨在为安全研究人员提供技术参考,帮助理解前端加密机制,并强调技术研究的合法性和合规性。

布啦啦 1096

C 语言数据存储详解与实例

C 语言中的数据类型可以分为两大类:内置类型和自定义类型(构造类型)。内置类型包括整型家族(charshortintlonglong long)、浮点型家族(floatdouble)等;自定义类型包括数组类型、结构体类型(struct)、枚举类型(enum)、联合类型(union)等。不同数据类型决定了开辟空间的大小以及查看内存空间的视角。//通过查看内存发现vs下的数据存储是小端模式。

qq_44729609的博客 546

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【C语言】详解数据存储

这样做的目的,是节省1位有效数字。现负数的,所以IEEE 754规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数。对于32位的浮点数(float),最高的1位为符号位s,接着的8位是指数E,剩下的23位为有效数字M。对于64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M。大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址。小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地。

Pear549669的博客 182

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C语言数据存储详解

文章目录前言一、数据类型的介绍1 ) 整形的各种形式(2)构造类型(3)指针类型二、整形在内存中的存储(1) 数据如何存储(2)大端,小端的介绍总结 前言 这篇文章主要介绍数据是在计算机内存中是如何存储的,以及内存的介绍,详细介绍整形数据类型,浮点型需要了解的小伙伴可以仔细看一下文章中的介绍,那么我们开始吧! 一、数据类型的介绍 char ——— 字符数据类型 short ——— 短整型 int ——— 整形 long ——— 长整型 long long ——— 更长的整型 float ——— 单精度浮点

stromSLR的博客 1044

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C语言:内存函数与数据存储详解

内存函数memcpy用于非重叠拷贝,memmove可处理重叠,memset初始化内存,memcmp比较内存。数据存储:整数用补码,浮点数按IEEE 754标准,大小端影响多字节数据的存储顺序。理解这些知识,能帮助开发者避免内存错误,优化程序性能,并深入理解计算机底层工作原理。

2503_90358233的博客 1474

【C语言】数据存储详解

一文封顶

L14777的博客 333

C语言数据存储机制与补码原理详解

计算机数据存储是编程基础中的核心概念,其中补码机制和IEEE 754浮点标准是理解数据表示的关键。补码通过统一加减法运算、消除零的歧义等设计,大幅提升了CPU运算效率,广泛应用于整型数据存储。IEEE 754标准则采用科学计数法编码,通过符号位、指数位和尾数位的组合实现浮点数存储。在嵌入式开发和系统编程中,深入理解这些存储机制能有效避免类型转换错误、数值溢出等常见问题。特别是在物联网设备、金融计算等场景,精确掌握数据存储细节对保证系统稳定性和计算精度至关重要。本文通过实际工程案例,剖析C语言中整型和浮点型数

weixin_33146151的博客 145

【C语言】数据存储篇,内存中的数据存储----C语言整型,浮点数的数据在内存中的存储以及大小端字节序【图文详解】

C语言中整型的存储是原码反码补码,那么浮点数的存储又是什么样的呢?本篇将以整型的数据存储开始,带大家了解C语言中浮点数据的存储。

cilmy23的note 1565

c语言存储信息源码,C语言 数据存储方式知识点详解

C语言 数据存储方式一、源码一个数的原码(原始的二进制码)有如下特点:最高位做为符号位,0表示正,为1表示负其它数值部分就是数值本身绝对值的二进制数负数的原码是在其绝对值的基础上,最高位变为1下面数值以1字节的大小描述:十进制数原码+150000 1111-151000 1111+00000 0000-01000 0000注:原码表示法简单易懂,与带符号数本身转换方便,只要符号还原即可,但当两个正...

weixin_42502601的博客 279

【C语言内存操作函数与数据存储详解】

本文详解memcpy/memmove/memset/memcmp模拟实现,剖析大小端、整型提升、浮点存储,并配有经典例题,助你彻底掌握C内存核心知识。

2501_93219710的博客 734

C语言内存布局与数据存储机制详解

计算机内存管理是编程基础中的核心概念,涉及数据在物理存储介质中的组织方式。从原理上看,内存以字节为单位编址,不同类型数据通过特定编码规则(如补码、IEEE 754)实现存储。在工程实践中,内存对齐机制能显著提升CPU访问效率,而指针与数组的连续内存特性为底层操作提供了灵活性。通过分析x86架构的小端存储模式可见,字节序直接影响多字节数据的解释方式。本文以C语言为例,深入剖析整型补码表示、浮点数IEEE 754标准等关键技术,并结合结构体内存对齐、动态内存管理等热词,揭示数据存储的底层逻辑及其在嵌入式开发等场

weixin_29234239的博客 123

C语言——内存中数据存储的详解(整型与浮点型)

char //字符类型 short //短整型 int //整型 long //长整型 long long //更长的长整型 float //单精度浮点型 double //双精度浮点型补充:long在当前VS2019的x86环境下为4个字节,而在当前VS2019的x64的环境下是8个字节。数据类型存在的意义:数据类型决定了该类型定义变量时,变量的取值范围大小(所占内存的空间大小,单位是字节)。以上就是我对整型数据和浮点型数据在内存中存储的全部总结。

sinzz的博客 1419

C语言WASM存储实战指南:4种高效数据存储模式详解

掌握C语言WASM的存储高效方案,解决Web端数据持久化难题。详解栈内存、线性内存、外部存储与共享数组4种模式,覆盖性能优化与跨模块通信场景。提升运行效率,降低内存开销,C语言WASM的存储实战指南值得收藏。

ProceGlow的博客 682

C语言内存管理与数据存储原理详解

数据存储是计算机程序运行的基础,理解内存管理机制对开发高效可靠的软件至关重要。在C语言中,变量以特定数据类型存储在内存中,包括整型、浮点型和字符型等。内存对齐和字节序是影响程序性能的关键因素,前者优化了数据访问效率,后者决定了多字节数据的存储顺序。指针作为内存地址的抽象,提供了直接操作内存的能力,但同时也带来了内存泄漏和越界访问等风险。掌握这些底层原理,不仅能帮助开发者编写更健壮的代码,还能进行有效的性能优化,特别是在嵌入式系统和性能敏感型应用中。通过合理使用调试工具如valgrind,可以及时发现内存相关

weixin_42544461的博客 84
上一篇: C语言对类型的转换
下一篇: 【树莓派学习】系统烧录及VNC连接、文件传输
flashier
博客等级 码龄3年 381粉丝 79原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值