当前位置: 首页 > 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…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...