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

news2024/9/29 19:22:25

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语言初学者,如果你有任何疑问或建议,欢迎随时留言讨论!让我们一起学习,共同进步!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2136884.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GPT-4-Turbo 和 Claude-3.5-Sonnet 图片识别出答题的是否正确 进行比较

1、比较的图片&#xff1a; 使用GPT-4-Turbo 输入的 提问&#xff1a; 识别图片中的印刷字和手写字&#xff0c;如果写错的给一个正确答案 图片 回复&#xff1a; 在图片中&#xff0c;印刷字显示的是一系列的英语填空练习题&#xff0c;而手写字则是填入空白处的答案。以…

[XILINX] 正点原子ZYNQ7015开发板!ZYNQ 7000系列、双核ARM、PCIe2.0、SFPX2,性能强悍,资料丰富!

正点原子ZYNQ7015开发板&#xff01;ZYNQ 7000系列、双核ARM、PCIe2.0、SFPX2&#xff0c;性能强悍&#xff0c;资料丰富&#xff01; 正点原子Z15 ZYNQ开发板&#xff0c;搭载Xilinx Zynq7000系列芯片&#xff0c;核心板主控芯片的型号是XC7Z015CLG485-2。开发板由核心板&…

【刷题】Day3--错误的集合

hello&#xff01;又见面啦~~~ 一道习题&#xff0c;要长脑子了...... 【. - 力扣&#xff08;LeetCode&#xff09;】 【思路】 /*** Note: The returned array must be malloced, assume caller calls free().*/void Bubble_sort(int arr[], int size) {int temp;for (int i…

Unity 粒子系统参数说明

一、Particle System 1. Duration&#xff08;持续时间&#xff09; 粒子系统运行一次所需的时间。它决定粒子系统持续播放的时间长度。 2. Looping&#xff08;循环播放&#xff09; 如果启用&#xff0c;粒子系统将在播放完一次后自动重新开始播放&#xff0c;直到你停止它…

北斗赋能万物互联:新质生产力的强劲驱动力

在数字化转型的大潮中&#xff0c;中国自主研制的北斗卫星导航系统&#xff0c;作为国家重大空间基础设施&#xff0c;正以前所未有的力量推动着万物互联时代的到来&#xff0c;成为新质生产力发展的重要基石。本文将深入剖析北斗系统如何以其独特的技术优势和广泛应用场景&…

【vue】vue3+ts对接科大讯飞大模型3.5智能AI

如今ai步及生活的方方面面,你是否也想在自己的网站接入ai呢&#xff1f;今天分享科大讯飞大模型3.5智能AI对接。 获取APPID、APISecret、APIKey 讯飞开放平台注册登录控制台创建自己的应用复制备用 准备工作做好,直接开始上代码了。 源码参考 <script setup lang"t…

一步到位:通过 Docker Compose 部署 EFK 进行 Docker 日志采集

一、EFK简介 Elasticsearch&#xff1a;一个开源的分布式搜索和分析引擎&#xff0c;用于存储和查询日志数据。它是 EFK 的核心组件&#xff0c;负责高效地存储和检索日志信息。 Filebeat&#xff1a;一个轻量级的日志采集器&#xff0c;主要用于将日志文件数据发送到 Logsta…

Ubuntu20+Noetic+cartographer_ros编译部署

1 准备工作 &#xff08;1&#xff09;准备Ubuntu20系统。 &#xff08;2&#xff09;安装ROS系统,参考 https://blog.csdn.net/weixin_46123033/article/details/139527141&#xff08;3&#xff09;Cartographer相关软件包和源码下载&#xff1a; https://gitee.com/mrwan…

go语言后端开发学习(七)——如何在gin框架中集成限流中间件

一.什么是限流 限流又称为流量控制&#xff08;流控&#xff09;&#xff0c;通常是指限制到达系统的并发请求数。 我们生活中也会经常遇到限流的场景&#xff0c;比如&#xff1a;某景区限制每日进入景区的游客数量为8万人&#xff1b;沙河地铁站早高峰通过站外排队逐一放行的…

ElementUI 快速入门:使用 Vue 脚手架搭建项目

文章目录 一 . ElementUI 的基本安装1.1 通过 Vue 脚手架创建项目1.2 在 vue 脚手架中安装 ElementUI1.3 编写页面 ElementUI 是 Vue.js 的强大 UI 框架&#xff0c;让前端界面开发变得简单高效。本教程将带你从安装到实战&#xff0c;快速掌握 ElementUI 的核心技巧。 核心内容…

解决antd-design-vue给选择组件a-select下拉菜单ant-select-dropdown设置样式不生效

实现效果&#xff1a;正常a-select会根据分辨率、缩放比例动态计算位置等&#xff0c;现在web端已经实现自适应分辨率&#xff0c;需要给下拉菜单设置固定的定位和宽度等样式&#xff0c;不让组件自动瞎设置定位、大小 1、a-select组件加上:getPopupContainer"(triggerNo…

IP地址、地址分类、子网掩码、子网划分、使用Python计算子网划分

IP 地址&#xff08;Internet Protocol Address&#xff09;乃是用于明确标识网络中各类设备的独一无二的地址。IP 地址主要存在两种重要类型&#xff0c;即 IPv4 和 IPv6 。 IPv4地址 IPv4 地址实则是一个由 32 位二进制数字所构成的标识&#xff0c;通常会以四个十进制数字…

如何精细优化网站关键词排名:实战经验分享

在数字营销日益激烈的今天&#xff0c;我深知每一个关键词的排名都关乎着网站的流量与转化。凭借多年的实战经验&#xff0c;我深刻体会到&#xff0c;要想在浩如烟海的网络世界中脱颖而出&#xff0c;精细化的关键词优化策略至关重要。今天&#xff0c;我将从实战角度出发&…

WPF利用Path自定义画头部导航条(TOP)样式

1;新建两个多值转换器&#xff0c;都有用处&#xff0c;用来动态确定PATH的X,Y州坐标的。 EndPointConverter 该转换器主要用来动态确定X轴&#xff0c;和Y轴。用于画线条的。 internal class EndPointConverter : IMultiValueConverter {public object Convert(object[] val…

PD虚拟机占用多少内存?使用电脑的虚拟内存会损害电脑吗

当我们讨论虚拟机及其对电脑性能的影响时&#xff0c;常常会出现两个关键问题&#xff1a;“PD虚拟机需要占用多少内存&#xff1f;”以及“启用电脑的虚拟内存是否会损害硬件&#xff1f;”对于依赖虚拟机进行日常工作的用户而言&#xff0c;这些问题尤为重要。 在本文中&…

Docker上安装mysql

获取 MySQL 镜像 获取镜像。使用以下命令来拉取镜像&#xff1a; 1docker pull mysql:latest 这里拉取的是最新版本的 MySQL 镜像。你也可以指定特定版本&#xff0c;例如&#xff1a; 1docker pull mysql:8.0 运行 MySQL 容器 运行 MySQL 容器时&#xff0c;你需要指定一些…

Linux与Ubuntu:内核与发行版的关系

在计算机科学的领域内&#xff0c;Linux和Ubuntu这两个术语频繁出现&#xff0c;但它们之间的确切联系往往不为大众所熟知。本文旨在深入探讨Linux内核与Ubuntu操作系统发行版之间的技术关系&#xff0c;并阐明它们各自的独特性质。 Linux内核&#xff1a;操作系统的基石 Lin…

R语言统计分析——功效分析(选择效应值)

参考资料&#xff1a;R语言实战【第2版】 功效分析中&#xff0c;预期效应值时最难决定的参数。它通常要求我们对研究主题有一定的了解&#xff0c;并由相应的测量经验。例如&#xff0c;过去研究中的数据可以用来计算效应值&#xff0c;这能为后来深层次的研究提供一些参考。 …

虚拟机Linux+Ubuntu操作系统 如何在虚拟机上安装docker VMPro 2024在线激活资源

一般情况下 不建议在windows系统上安装docker Windows本身就自带一个虚拟机叫WSL 但是不推荐在日常使用的电脑上安装 我们要下一个虚拟机 我们在window上安装docker会被告知WSL内核太老 我们要一个专业的 隔离的虚拟机软件 推荐使用虚拟机 这是我们的虚拟机软件 我们这边…

爬虫代理API的全面解析:让数据抓取更高效

在大数据时代&#xff0c;网络爬虫已经成为收集和分析数据的重要工具。然而&#xff0c;频繁的请求会导致IP被封禁&#xff0c;这时候爬虫代理API就显得尤为重要。本文将详细介绍爬虫代理API的作用、优势及如何使用&#xff0c;帮助你更高效地进行数据抓取。 什么是爬虫代理AP…