当前位置: 首页 > news >正文

c语言:整数与浮点数在内存中的存储方式

整数在内存中的存储:

在计算机内存中,整数通常以二进制形式存储。计算机使用一定数量的比特(bit)来表示整数,比如32位或64位。在存储整数时,计算机使用补码形式来表示负数,而使用原码形式来表示正数。整数的存储方式使得计算机能够进行加减乘除等运算。


浮点数在内存中的存储:

与整数不同,浮点数采用IEEE 754标准来存储。在内存中,浮点数由三个部分组成:符号位、指数位和尾数位。这种存储方式使得计算机能够表示小数和非常大或非常小的数字,但也带来了精度丢失的问题。


IEEE 754标准

IEEE 754标准定义了浮点数的存储格式,包括单精度浮点数(32位)和双精度浮点数(64位)。在这两种格式中,浮点数的存储结构都由三个部分组成:符号位、指数位和尾数位。

  1. 符号位:用于表示浮点数的正负,0表示正数,1表示负数。

  2. 指数位:用于表示浮点数的阶码(指数部分),指数位的长度决定了浮点数的表示范围。

  3. 尾数位:用于表示浮点数的尾数,尾数位的长度决定了浮点数的精度。

单精度浮点数(32位)

单精度浮点数采用32位来存储,其中1位用于符号位,8位用于指数位,23位用于尾数位。

符号位(1位) 指数位(8位) 尾数位(23位)

双精度浮点数(64位)

双精度浮点数采用64位来存储,其中1位用于符号位,11位用于指数位,52位用于尾数位。

符号位(1位) 指数位(11位) 尾数位(52位)

 

特别注意: 

当我们使用单精度浮点数(32位)来存储一个小数时,可能会出现精度丢失的情况。例如,让我们考虑存储十进制数 0.1 在单精度浮点数中的表示。

在十进制中,0.1 可以用有限位数准确表示,但在二进制中,0.1 是一个无限循环小数。因此,在单精度浮点数中,0.1 的精确表示是不可能的。

让我们看看单精度浮点数中存储 0.1 的近似表示:

首先,将 0.1 转换为二进制。0.1 的二进制表示是 0.00011001100110011001100110...,这是一个无限循环。

然后,根据单精度浮点数的格式,我们将其表示为科学计数法形式:1.100110011001100110011002 x 2^-4。

在单精度浮点数中,我们需要舍入到23位尾数。因此,最终存储的近似值是:

符号位:0(正数)
指数位:-4 + 127(偏移值,127是单精度浮点数的偏移量)
尾数位:10011001100110011001100

这个存储的近似值会导致精度丢失,因为实际的0.1在单精度浮点数中无法被精确表示。在进行浮点数运算时,这种精度丢失可能会积累导致不准确的结果。

举个例子:

#include <stdio.h>
#include <stdint.h>int main() 
{float num = 0.1f; // 使用单精度浮点数表示0.1// 将浮点数的内存表示以十六进制打印出来uint32_t* ptr = (uint32_t*)&num;printf("0.1的内存表示为: 0x%08x\n", *ptr);return 0;
}

7faa5db4797b431e951d9d392bf81caf.png

 

#include <stdio.h>
#include <stdint.h>int main() 
{float num = -27.25f; // 使用单精度浮点数表示-27.25// 将浮点数的内存表示以十六进制打印出来uint32_t* ptr = (uint32_t*)&num;printf("内存中的表示为: 0x%08x\n", *ptr);// 分别提取符号位、指数位和尾数位uint32_t sign = (*ptr >> 31) & 0x1;uint32_t exponent = (*ptr >> 23) & 0xFF;uint32_t mantissa = *ptr & 0x7FFFFF;printf("符号位: %d\n", sign);printf("指数位: 0x%x\n", exponent);printf("尾数位: 0x%x\n", mantissa);return 0;
}

63dff24654c942b498cdf9c017c1b914.png

符号位:1位
┌─────┬───────────────────────┬─────────────────────────────────────┐
|  S  |       指数位(E)      |              尾数位(M)              |
└─────┴───────────────────────┴─────────────────────────────────────┘31                       23                                  0

例如  1.5,

符号位:1位
┌─────┬───────────────────────┬─────────────────────────────────────┐
|  0  |       01111111        |       10000000000000000000000       |
└─────┴───────────────────────┴─────────────────────────────────────┘31                       23                                  0
  • 符号位(S):用于表示浮点数的正负,0表示正数,1表示负数。
  • 指数位(E):用于表示浮点数的指数部分,通过偏移(bias)来表示实际的指数值。
  • 尾数位(M):用于表示浮点数的尾数部分,包括小数点后面的数字。

 

9c390aaba26d4f8bb4f15b0a48dc4430.png

 

相关文章:

c语言:整数与浮点数在内存中的存储方式

整数在内存中的存储&#xff1a; 在计算机内存中&#xff0c;整数通常以二进制形式存储。计算机使用一定数量的比特&#xff08;bit&#xff09;来表示整数&#xff0c;比如32位或64位。在存储整数时&#xff0c;计算机使用补码形式来表示负数&#xff0c;而使用原码形式来表示…...

dockerdesktop 导出镜像,导入镜像

总体思路 备份时 容器 > 镜像 > 本地文件 恢复时 本地文件 > 镜像 > 容器 备份步骤 首先,把容器生成为镜像 docker commit [容器名称] [镜像名称] 示例 docker commit nginx mynginx然后,把镜像备份为本地文件,如果使用的是Docker Desktop,打包备份的文件会自动存…...

2-Django、Flask和Tornado三大主流框架对比

在Python的web开发框架中&#xff0c;目前使用量最高的几个是Django、Flask和Tornado&#xff0c; 经常会有人拿这几个对比&#xff0c;相信大家的初步印象应该是 Django大而全、Flask小而精、Tornado性能高。 了解常用框架 Django 主要特点是大而全,集成了很多组件,例如: Mo…...

【openssl】Window系统如何编译openssl

本文主要记录如何编译出windows版本的openss的lib库 如果需要获取RSA公钥私钥&#xff0c;推荐【openssl】 生成公钥私钥 |通过私钥获取公钥-CSDN博客 目录 1.下载openssl&#xff0c;获得openssl-master.zip。 2.下载Perl 3.下载NASM 4.配置perl和NASM的环境变量 5.进入…...

[leetcode 双指针]

1. 三数之和 M :::details 给你一个包含 n 个整数的数组 nums&#xff0c;判断 nums 中是否存在三个元素 a&#xff0c;b&#xff0c;c &#xff0c;使得 a b c 0 &#xff1f;请你找出所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 示例…...

Notepad++批量添加引号

工作中经常会遇到这样情景&#xff1a;业务给到一批订单号&#xff0c;需要查询这批订单的某些字段信息。在where条件中需要传入这些订单号的数组&#xff0c;并且订单号用引号引起&#xff0c;用引号隔开。 字符串之间长度相同 可以按住CtrlAlt和鼠标左键选中区域&#xff0…...

HarmonyOS4.0从零开始的开发教程04 初识ArkTS开发语言(下)

HarmonyOS&#xff08;二&#xff09; 初识ArkTS开发语言&#xff08;下&#xff09;之TypeScript入门 声明式UI基本概念 应用界面是由一个个页面组成&#xff0c;ArkTS是由ArkUI框架提供&#xff0c;用于以声明式开发范式开发界面的语言。 声明式UI构建页面的过程&#xff…...

Failed to connect to github.com port 443 after 21055 ms: Timed out

目前自己使用了梯*子还是会报这样的错误&#xff0c;连接不到的github。 查了一下原因&#xff1a; 是因为这个请求没有走代理。 解决方案&#xff1a; 设置 -> 网络和Internet -> 代理 -> 编辑 记住这个IP和端口 使用以下命令&#xff1a; git config --global h…...

Python小技巧:冻结参数,让你的代码变简洁

Python 有一些非常使用的模块&#xff0c; functools 就是其中之一。今天我们来说说其中的 partial 函数&#xff0c; partial 函数看起来平平无奇&#xff0c;如果你经常翻看高手们写的库&#xff0c;会发现很多地方都在使用这函数。 入门 我们从一个小场景开始。 现在我们需…...

如何判断电脑电源质量的好坏?

电脑电源作为电脑的关键部件直接影响到电脑的性能和寿命&#xff0c;因此选择一个好的电源至关重要。那么要如何判断电脑电源的好坏呢?判断的指标都有哪些呢? 1.外观检测 观察电源外观可以初步判断电脑电源的工艺质量和材料质量。外观检测需要检查电源外壳是否坚固&#xff0…...

装饰器基础知识

一、概述 装饰器是可调用的对象&#xff0c;其参数是另一个函数&#xff08;被装饰的函数&#xff09;。装饰器可能会处理被装饰的函数&#xff0c;然后把它返回&#xff0c;或者将其替换成另一个函数或可调用对象。 装饰器的一大特性是&#xff0c;能把被装饰的函数替换成其他…...

轻量封装WebGPU渲染系统示例<42>- vsm阴影实现过程(源码)

前向实时渲染vsm阴影实现的主要步骤: 1. 编码深度数据&#xff0c;存到一个rtt中。 2. 纵向和横向执行遮挡信息blur filter sampling, 存到对应的rtt中。 3. 将上一步的结果(rtt)应用到可接收阴影的材质中。 具体代码情况文章最后附上的实现源码。 当前示例源码github地址: …...

[Electron] 将应用日志文件输出

​ 日志文件输出可以使用 electron-log 模块。 electron-log 是一个用于 Electron 应用程序的日志记录库。它提供了一种简单且方便的方式来在 Electron 应用中记录日志信息&#xff0c;并支持将日志输出到文件、控制台和其他自定义目标。 以下是 electron-log 的一些主要特点…...

特性【C#】

C#特性是一种用于在编译时向程序元素添加声明性信息的语言结构。 下面是C#特性的使用方法&#xff1a; 1.使用系统提供的特性&#xff1a; 可以使用系统提供的特性来标记类、方法、属性等&#xff0c;以便在编译时进行验证或者提供其他信息。例如&#xff0c;可以使用Obsole…...

理解SpringIOC和DI第一课(Spring的特点),IOC对应五大注解,ApplicationContext vs BeanFactory

Spring是一个包含众多工具等Ioc容器 对象这个词在Spring范围内&#xff0c;称为bean Spring两大核心思想 1.IOC (IOC是控制反转&#xff0c;意思是控制权反转-控制权&#xff08;正常是谁用这个对象&#xff0c;谁去创建&#xff0c;&#xff09;-控制对象的控制权&#xf…...

【微服务】分布式限流如何实现

Sentinel 是一款阿里巴巴开源的分布式系统级流量控制组件&#xff0c;它提供了流量的自适应控制、熔断降级、系统负载保护等功能。下面是使用 Sentinel 实现分布式限流方案的基本步骤&#xff1a; 引入 Sentinel 依赖&#xff1a;首先在你的 Java 项目中引入 Sentinel 的相关依…...

【S32K3环境搭建】-0.3-S32DS安装实时驱动RTD(Real-Time Driver)

目录 1 什么是“实时驱动RTD(Real-Time Driver)” 2 安装“实时驱动RTD(Real-Time Driver)” 2.1 方法一&#xff1a;通过S32DS Extensions and Updates安装“实时驱动RTD(Real-Time Driver)” 2.2 方法二&#xff1a;通过Install New Software…安装“实时驱动RTD(Real-Ti…...

软件设计之适配器模式

类模式 我们知道插座的电压为交流电220V&#xff0c;而日常电器使用的是直流电且电压会较小&#xff0c;比如手机充电会通过插头适配器达到额定的输入电流。下面我们实现这个案例&#xff1a;将220V电压转化为5V的电压。 package Adapter.Class;public class Adapter extends …...

虚拟化逻辑架构:OVS 交换机与端口管理

目录 一、实验 1.OVS 交换机管理 2.OVS端口管理 二、问题 1.KVM下的br0和virbr0有何区别 2.OVS 虚拟交换机 与接口如何实现关联的创建和删除 3.两个ovs之间如何进行流量交互 4.虚拟网络如何和物理网络互联 一、实验 1.OVS 交换机管理 &#xff08;1&#xff09;查看网…...

【springboot】idea项目启动端口被占用

问题 idea本地启动springboot项目端口老是被占用 解决 关闭被占用的端口进程 步骤: 1. winR打开程序框 2. 查出被占用端口的进程id netstat -ano | finderstr 端口号 例如 netstat -ano | finderstr 81013.杀死进程 taskkill /pid 进程id -t -f 例如 taskkill /pid 2…...

Biomni:生物医学图像分析从入门到精通,AI与传统CV融合实战

1. 项目概述&#xff1a;当AI学会“看”懂生物医学图像如果你在生物医学研究、药物发现或者临床诊断领域工作&#xff0c;大概率会和我一样&#xff0c;对海量的生物医学图像数据感到既兴奋又头疼。兴奋的是&#xff0c;这些图像——无论是显微镜下的细胞切片、组织病理学玻片&…...

3个维度深度解析:UABEA如何重塑Unity资源处理生态

3个维度深度解析&#xff1a;UABEA如何重塑Unity资源处理生态 【免费下载链接】UABEA c# uabe for newer versions of unity 项目地址: https://gitcode.com/gh_mirrors/ua/UABEA 在Unity游戏开发和资源处理的复杂生态中&#xff0c;开发者常常面临一个核心挑战&#xf…...

VectorDBBench:向量数据库性能基准测试工具详解与实战

1. 项目概述&#xff1a;向量数据库性能测试的“瑞士军刀”如果你正在评估或使用向量数据库&#xff0c;那么你一定遇到过这个灵魂拷问&#xff1a;“这么多产品&#xff0c;到底哪个最适合我的场景&#xff1f;”是选名声在外的老牌劲旅&#xff0c;还是选后起之秀的专精选手&…...

Scarab空洞骑士模组管理器:2024年最完整的安装与使用指南

Scarab空洞骑士模组管理器&#xff1a;2024年最完整的安装与使用指南 【免费下载链接】Scarab An installer for Hollow Knight mods written with Avalonia. 项目地址: https://gitcode.com/gh_mirrors/sc/Scarab 还在为空洞骑士模组安装的复杂流程而烦恼吗&#xff1f…...

开源技能图谱工具SkillPort:Go语言构建的知识管理利器

1. 项目概述&#xff1a;一个技能图谱与知识管理的开源利器 最近在整理个人技术栈和团队知识库时&#xff0c;我一直在寻找一个能直观展示技能关联、又能深度管理学习路径的工具。市面上的笔记软件要么太“平”&#xff0c;只能线性记录&#xff1b;要么太“重”&#xff0c;像…...

基于IMAP的邮件自动化处理工具mymailclaw配置与实战指南

1. 项目概述&#xff1a;一个轻量级的邮件抓取与处理工具最近在折腾一个需要自动化处理邮件通知的小项目&#xff0c;发现市面上的方案要么太重&#xff0c;要么不够灵活。直到我遇到了psandis/mymailclaw这个项目&#xff0c;它就像一把小巧而锋利的瑞士军刀&#xff0c;专门用…...

【独家首发】ElevenLabs乌尔都语语音SDK逆向分析(v2.4.1):提取未文档化emotion_intensity参数,实现新闻播报级庄严语调控制

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;ElevenLabs乌尔都语语音SDK逆向分析全景概览 ElevenLabs 官方未公开乌尔都语&#xff08;ur-PK&#xff09;的独立语音 SDK&#xff0c;但其 Web API 实际支持该语言的 TTS 合成。通过对官方 JS SDK&am…...

基于RP2040与I2C总线打造可编程合成器吉他:从硬件到固件的完整实践

1. 项目概述&#xff1a;打造你的第一把可编程合成器吉他 如果你对电子音乐制作和嵌入式硬件开发都感兴趣&#xff0c;那么将两者结合的DIY项目无疑是最迷人的领域。今天要分享的&#xff0c;就是基于Adafruit RP2040 PropMaker Feather微控制器&#xff0c;从零开始打造一把功…...

MedAgentBench:大模型临床决策能力评估基准详解与应用

1. 项目概述&#xff1a;当大模型成为医疗决策的“实习生” 最近在医疗AI的圈子里&#xff0c;一个名为“MedAgentBench”的开源项目引起了不小的讨论。这个由斯坦福机器学习组&#xff08;Stanford ML Group&#xff09;发布的项目&#xff0c;其核心目标非常明确&#xff1a;…...

如何永久保存微信聊天记录?三步实现完整备份与智能分析

如何永久保存微信聊天记录&#xff1f;三步实现完整备份与智能分析 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeCh…...