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

C语言-整数和浮点数在内存中的存储-详解-上

C语言-整数和浮点数在内存中的存储-详解-上

  • 1.前言
  • 2.整数
    • 2.1无符号整数
    • 2.2原码、反码、补码
      • 符号位
      • 最大值
      • 转换过程
      • 补码的意义
        • 简化算术运算
        • 易于转换
        • 方便溢出处理

1.前言

在C语言的使用中,需要时刻关注数据的类型,不同类型交替使用可能会发生错误,下面通过一个简单的例子来说明这一点:

#include <stdio.h>
int main()
{int n = 5.5;float* p = (float*)&n;printf("%d\n", n);printf("%f\n", *p);*p = 5.5;printf("%d\n", n);printf("%f\n", *p);return 0;
}

这段代码的运行结果:
在这里插入图片描述
同一个5.5,为什么会输出不同的结果?
要理解这个问题,需要清楚整数和浮点数如何在内存中存储。
下文将详细介绍整数在内存中的存储。

2.整数

2.1无符号整数

这种数只能表示非负整数
在二进制表示中,每一位都是数值位,没有符号位。
如:

unsigned int n1 = 0xffffffff;
printf("(n1 = 0x%x)%u",n1,n1);
printf("INT_MAX=%d\n", INT_MAX);

n1的二进制表示:
在这里插入图片描述
运行结果:
在这里插入图片描述
这里的INT_MAX指的是有符号整数的最大值,可以发现,无符号整数能比有符号整数更大。

2.2原码、反码、补码

原码、反码、补码是整数的三种二进制表示方法。
对于无符号整数,三种方法没有区别。
对于有符号整数,三种方法均分为符号位数值位两个部分。

符号位

符号位指的是最高位,用0表示正数,用1表示负数。

最大值

整数占32个比特位,
因此,无符号的最大值为:
在这里插入图片描述
有符号的多了一个符号位,因此,最大值为:
在这里插入图片描述
可以简记为二十亿
在实际应用中,特别是在OJ题中,题目最后有时会给数据范围。
这时,需要与数据类型可存储的最大值比较,判断是否会溢出,以此调整做题方法。
例如,在我的用C语言完成高精度问题中,就展示了一种溢出的实例与相应的解决方法。
再例如:

int n2 = 0xffffffff;
printf("(n2 = 0x%x)%d\n", n2, n2);

n2的二进制表示:
在这里插入图片描述

运行结果:
在这里插入图片描述
n2 在内存中的表示为 0xffffffff,运行结果会显示 n2 的值为 -1
最高位是1,因此是个负数,但-1是怎么来的,这就涉及到了原码、反码、补码的相互转换。

转换过程

正数:原码、反码、补码相同。
负数

  • 原码由数值直接翻译为二进制得到。
  • 反码由原码符号位不变,其他位按位取反得到。
  • 补码由反码加一得到。

示例:
在这里插入图片描述
在内存中,整数存的是补码,而赋值操作,是将二进制值直接赋给变量,并直接影响它在内存中的值,这里可以调试看看:
在这里插入图片描述
而打印的是数值,需要将补码再次转化成原码:
补码->符号位不变,其他位按位取反->反码->加一->原码
这就是为什么给n2赋值了0xffffffff后,打印结果为-1

负数原码、反码、补码的相互转换:

符号位不变,其他位按位取反
加一
符号位不变,其他位按位取反
加一
原码
反码
补码

补码的意义

现代计算机系统几乎都采用补码表示有符号的整数,原因在于补码具有许多优点:

简化算术运算

例如,补码能使减法变成加法:
1 - 1 == 1 + (-1):
在这里插入图片描述
因此,在硬件设计中,只需要一个加法器就能完成所有的基本算术运算。

易于转换

转换一个有符号整数到它的相反数的过程在补码表示中非常简单:

  1. 取反
  2. 加一
按位取反,加一
按位取反,加一
正数
负数

还是用1-1举例子:
在这里插入图片描述
这个过程之所以简单,是因为它只需要两次基本的硬件操作:一次按位取反操作和一次加法操作。这对于硬件设计来说是非常高效的,因为它不需要额外的复杂逻辑来区分正数和负数的转换。

方便溢出处理

在补码系统中,如果发生溢出,结果将会被截断,只保留最低的有效位。
这就是为什么1的补码加-1的补码结果为0
这也意味着,如果一个运算的结果超出了表示范围,它将会被“环绕”回到可用的表示范围内:
在这里插入图片描述


希望本篇文章对你有所帮助!并激发你进一步探索C语言的兴趣!
本人仅是个C语言初学者,如果你有任何疑问或建议,欢迎随时留言讨论!让我们一起学习,共同进步!

相关文章:

C语言-整数和浮点数在内存中的存储-详解-上

C语言-整数和浮点数在内存中的存储-详解-上 1.前言2.整数2.1无符号整数2.2原码、反码、补码符号位最大值转换过程补码的意义简化算术运算易于转换方便溢出处理 1.前言 在C语言的使用中&#xff0c;需要时刻关注数据的类型&#xff0c;不同类型交替使用可能会发生错误&#xff…...

图论篇--代码随想录算法训练营第六十一天打卡| Floyd 算法,A*算法

Floyd 算法&#xff08;求多源汇最短路&#xff09; 题目链接&#xff1a;97. 小明逛公园 题目描述&#xff1a; 小明喜欢去公园散步&#xff0c;公园内布置了许多的景点&#xff0c;相互之间通过小路连接&#xff0c;小明希望在观看景点的同时&#xff0c;能够节省体力&…...

CMake构建学习笔记16-使用VS进行CMake项目的开发

文章目录 1. 概论2. 详论2.1 创建工程2.2 加载工程2.3 配置文件2.4 工程配置2.5 调试执行 3. 项目案例4. 总结 1. 概论 在之前的系列博文中&#xff0c;我们学习了如何构建第三方的依赖库&#xff0c;也学习了如何去组建自己的CMake项目&#xff0c;尤其是学习了CMake的核心配…...

数据结构中线性表的定义和特点

线性表&#xff1a;有n个数据特征相同的元素构成的有限序列。 特点&#xff1a; 除了第一个元素&#xff0c;最后一个元素&#xff0c;其余的元素都有唯一的前驱和唯一的后继。 案例引入&#xff1a; 一元多项式的运算&#xff1a; 可以将一元多项式p(x)抽象为一个有n1个系…...

【PyTorch单点知识】PyTorch中的自动混合精度(AMP)模块详解

文章目录 0. 前言1. 什么是自动混合精度&#xff1f;2. PyTorch AMP 模块3. 如何使用 PyTorch AMP3.1 环境准备3.2 代码实例3.3 代码解析 4. 结论 0. 前言 按照国际惯例&#xff0c;首先声明&#xff1a;本文只是我自己学习的理解&#xff0c;虽然参考了他人的宝贵见解及成果&a…...

数据结构 --- 哈希表

哈希表&#xff08;Hash Table&#xff09;&#xff0c;也叫散列表&#xff0c;是一种根据关键码值&#xff08;Key value&#xff09;而直接进行访问的数据结构。 一、基本原理 哈希函数 哈希表通过一个特定的哈希函数&#xff0c;将关键码映射到表中的一个位置。这个位置通常…...

Linux相关:在阿里云下载centos系统镜像

文章目录 1、镜像站2、下载方式一2.1、第一步打开镜像站地址2.2 下载地址: https://mirrors.aliyun.com/centos/2.3、选择7版本2.4、镜像文件在isos文件夹中2.5、选择合适的版本 3、下载镜像快捷方式 1、镜像站 阿里云镜像站地址 2、下载方式一 2.1、第一步打开镜像站地址 2…...

24. 线模型对象

线模型Line渲染顶点数据 下面代码是把几何体作为线模型Line (opens new window)的参数&#xff0c;你会发现渲染效果是从第一个点开始到最后一个点&#xff0c;依次连成线。 // 线材质对象 const material new THREE.LineBasicMaterial({color: 0xff0000 //线条颜色 }); //…...

EasyExcel 快速入门

目录 一、 EasyExcel简介 官网链接&#xff1a; 代码链接&#xff1a; 二、 EasyExcel快速上手 引入依赖&#xff1a; 设置Excel相关注解 编写对应的监听类&#xff1a; 简单写入数据&#xff1a; 简单读取数据&#xff1a; 不需要使用监听器&#xff1a; 需要使…...

Sparse4D v1

Sparse4D: Multi-view 3D Object Detection with Sparse Spatial-Temporal Fusion Abstract 基于鸟瞰图 (BEV) 的方法最近在多视图 3D 检测任务方面取得了重大进展。与基于 BEV 的方法相比&#xff0c;基于稀疏的方法在性能上落后&#xff0c;但仍然有很多不可忽略的优点。为了…...

速盾:你知道高防 IP 和高防 CDN 的区别吗?

在当今网络安全形势日益严峻的情况下&#xff0c;网站的安全防护成为了企业和个人关注的焦点。高防 IP 和高防 CDN 作为两种常见的网络安全防护手段&#xff0c;被广泛应用于网站的安全防护中。那么&#xff0c;高防 IP 和高防 CDN 有什么区别呢&#xff1f;防护网站哪个更好呢…...

HTML和CSS网页制作成品

HTML和CSS网页制作成品 一、引言 1. 背景介绍 在当今数字化时代&#xff0c;网页已成为信息传递和交流的重要媒介。HTML和CSS作为网页制作的基石&#xff0c;对于构建美观、功能丰富的网站至关重要。本文将详细介绍如何使用HTML和CSS来制作一个网页成品。 2. 目的和重要性 …...

Ai+若依(集成easyexcel实现excel表格增强)

EasyExcel 介绍 官方地址:EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel 官网 Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一…...

钻机、塔吊等大型工程设备,如何远程维护、实时采集运行数据?

在建筑和工程领域&#xff0c;重型设备的应用不可或缺&#xff0c;无论是在道路与桥梁建设、高层建筑施工&#xff0c;还是在风电、石油等能源项目的开发中&#xff0c;都会用到塔吊、钻机等大型机械工程设备。 随着数字化升级、工业4.0成为行业发展趋势&#xff0c;为了进一步…...

【AutoX.js】选择器 UiSelector - 查找包名

文章目录 原文&#xff1a;https://blog.c12th.cn/archives/38.html选择器 UiSelector - 查找包名笔记直接查找包名双层判断(推荐)查找最外层控件的子控件 最后 原文&#xff1a;https://blog.c12th.cn/archives/38.html 选择器 UiSelector - 查找包名 笔记 AutoX.js UiSelec…...

ERP进销存多仓库管理系统源码 带完整的安装代码包以及搭建部署教程

系统概述 ERP进销存多仓库管理系统是一款专为中小企业量身定制的集成化管理软件&#xff0c;它集成了采购管理、销售管理、库存管理、财务管理以及多仓库协同作业等核心模块。通过统一的平台&#xff0c;企业可以实时掌握商品从入库到出库的全过程&#xff0c;实现库存的自动化…...

数据清洗-缺失值填充-对XGBoost参数优化填充

目录 一、安装所需的python包二、采用XGboost算法进行缺失值填充2.1可直接运行代码2.2以某个缺失值数据进行实战2.2.1 代码运行过程截屏:2.2.2 填充后的数据截屏:三、网格搜索(Grid Search)对 XGBoost 模型的超参数进行优化原理介绍3.1 说明3.2 参数优化的原理1. 网格搜索(…...

Qt_按钮类控件

目录 1、QAbstractButton 2、设置带图标的按钮 3、设置带有快捷键的按钮 4、QRadioButtion&#xff08;单选按钮&#xff09; 4.1 QButtonGroup 5、QCheckBox 结语 前言&#xff1a; 按钮类控件是Qt中最重要的控件类型之一&#xff0c;该类型的控件可以通过鼠标的点击…...

union 的定义和基本结构以及用途

在 C 语言中&#xff0c;union&#xff08;联合体&#xff09; 是一种数据结构&#xff0c;它允许多个成员共享相同的内存空间。换句话说&#xff0c;联合体中的所有成员都存储在同一块内存区域&#xff0c;不同的成员会占用相同的内存地址&#xff0c;但在同一时刻只能保存一个…...

混合整数规划及其MATLAB实现

目录 引言 混合整数规划的基本模型 混合整数规划的求解方法 MATLAB中的混合整数规划实现 示例&#xff1a;多变量系统的混合整数规划 表格总结&#xff1a;混合整数规划的求解方法与适用场景 结论 引言 混合整数规划&#xff08;Mixed Integer Programming, MIP&#xf…...

【数据结构】6——图1,概念

数据结构6——图1&#xff0c;概念 文章目录 数据结构6——图1&#xff0c;概念基本概念图的分类图的表示方法 基本概念 由 顶点&#xff08;Vertex&#xff09; 和 边&#xff08;Edge&#xff09; 组成的集合。顶点表示图中的点&#xff0c;而边表示顶点之间的连接。记为 G …...

技术周总结 09.09~09.15周日(C# WinForm WPF)

文章目录 一、09.09 周一1.1) 问题01: Windows桌面开发中&#xff0c;WPF和WinForm的区别和联系&#xff1f;联系&#xff1a;区别&#xff1a; 二、09.12 周四2.1&#xff09;问题01&#xff1a;visual studio的相关快捷键有哪些&#xff1f;通用快捷键编辑导航调试窗口管理 2…...

4K投影仪选购全攻略:全玻璃镜头的当贝F6,画面细节纤毫毕现

在当今的投影市场上&#xff0c;4K投影仪已经成了主流产品&#xff0c;越来越多家庭开始关注如何选择一款性价比高、口碑好的4K投影仪。4K投影仪其实指的是具备3840*2160像素分辨率投影仪&#xff0c;它能够提供更清晰、更细腻、更真实的画面效果。 那么4K投影仪该怎么选&…...

除了字符串前导的*号之外,将串中其它*号全部删除

要求 假定输入的字符串中只包含字母和*号。请编写函数fun&#xff0c;它的功能是:除了字符串前导的*号之外&#xff0c;将串中其它*号全部删除。在编写函数时&#xff0c;不得使用C语言提供的字符串函数。函数fun中给出的语句仅供参考。 例如&#xff0c;字符串中的内容为:-**…...

SpringBoot开发——使用@Slf4j注解实现日志输出

文章目录 1、Lombok简介2、SLF4J简介3、实现步骤3.1 创建SpringBoot项目3.2 添加依赖3.3 使用 Slf4j 注解3.4 输出日志信息 4、结论 在现代Java开发中&#xff0c;日志记录是至关重要的。它不仅帮助开发者调试代码&#xff0c;还便于监控系统运行状态和性能。 Lombok 和 SLF4J …...

VSCode拉取远程项目

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…...

【已解决】SpringBoot3项目整合Druid依赖:Druid监控页面404报错

文章标题 问题描述原因分析解决方案参考资料 问题描述 最近&#xff0c;笔者在SpringBoot3项目中整合Druid连接池时&#xff0c;偶然翻到一条介绍Druid监控的短视频&#xff0c;兴致盎然之下尝试设置了一下Druid监控。 But&#xff0c;按照视频中提供的yml参数对照设置&#x…...

【算法】滑动窗口—找所有字母异位词

“找到字符串中所有字母异位词”的难度为Medium&#xff0c;看一下题目&#xff1a; 给定一个字符串 S 和一个非空字符串 T&#xff0c;找到 S 中所有是 T 的字母异位词的子串&#xff0c;返回这些子串的起始索引。 所谓的字母异位词&#xff0c;其实就是全排列&#xff0c;原题…...

Vue安装及环境配置【图解版】

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 Facts speak louder than words&#xff01; 目录 一.node.js的安装…...

绕过CDN查找真实IP方法

1、前言 在新型涉网案件中&#xff0c;我们在搜集到目标主站之后常常需要获取对方网站的真实IP去进一步的信息搜集&#xff0c;但是现在网站大多都部署了CDN&#xff0c;将资源部署分发到边缘服务器 实现均衡负载&#xff0c;降低网络堵塞&#xff0c;让用户能够更快地访问自己…...