【C语言】整数,浮点数数据在内存中的存储

Tiny Spark get dazzling some day.

目录

  • 1. 整数在内存中的存储
    • 1.1 原码、反码、补码
    • 1.1 大小端存储
      • 1.2.1 字节序分类
      • 1.2.2 判断字节序
  • 2. 浮点数在内存中的存储
    • 2.1 浮点数的存储形式
    • 2.2 浮点数的 “ 存 ”
      • 2.2.1 S
      • 2.2.2 E
      • 2.2.3 F
    • 2.3 浮点数的 “ 取 ”
      • 2.3.1 S
      • 2.3.2 E、F
  • 3. 浮点数存储例题

1. 整数在内存中的存储

1.1 原码、反码、补码

我们都知道,数据在二进制中都是以 二进制 的形式存储在计算机中,而二进制只有 01两个数字。

有符号整数的二进制序列中,最高位 称 符号位,表示正负;其他位 称 数值位,表示数值。
无符号整数的二进制序列中,没有符号位,即每一位 均为 数值位
有多少位具体看 该整数的类型大小,比如 int 类型的

整数 的二进制表示 有三种,分别为 原码反码补码(数据存放在内存中的就是 补码 !)。
整数的三种码都是一样的,负数的则有所不同:

  • 原码 是整数数值直接翻译成 二进制 所得。
  • 反码 是将 原码 的符号位不变,其他数值位按位取反所得。
  • 补码反码 + 1 所得。
  • 若从
    举个例子
  • 整数十进制:-1
  • 原码:1 0 0 0 0 0 0 1
  • 反码:1 1 1 1 1 1 1 0
  • 补码:1 1 1 1 1 1 1 1

1.1 大小端存储

先来看个例子

// 我们在编译器中创造一个变量, 看看它在内存中的存储情况
int a = 0x11223344; // 用十六进制数值对 变量a 进行初始化赋值

开启调试 打开内存监视窗口 看一下
在这里插入图片描述
一开始的时候我也有点懵逼,这里不应该是显示为 11 22 33 44 这样吗?
后来我了解到,当 数据大小 >= 2个字节 ,在内存中存储的时候,就会有 字节序 的问题。
存储顺序 就分为 大端存储小端存储

1.2.1 字节序分类

在这里插入图片描述

在这里插入图片描述

  • 大端存储 :是指数据的 低位字节内容 保存在内存的 高地址 处,而数据的 高位字节内容,保存
    在内存的 低地址 处。
  • 小端存储 :是指数据的 低位字节内容 保存在内存的 低地址 处,而数据的 高位字节内容,保存
    在内存的 高地址 处。

简记:
(内容)(顺序)(内容)(顺序)
大端
小端

那么,我们该如何知道当前机器的字节序呢?

1.2.2 判断字节序

  • 第一种
int check()
{
	int i = 1;
	return (*(char*)&i);
}
int main()
{
	int ret = check();
	if(ret == 1)
	{
		printf("小端存储\n");
	}
	else
	{
		printf("大端存储\n");
	}
	return 0;
}

在这里插入图片描述

  • 第二种
int check()
{
	union // 在联合体中 a 和 b 共用同一块空间
 	{
 		int a;
 		char b;
 	}un;
 	un.i = 1;
 	return un.b;
}
int main()
{
	int ret = check();
	if(ret == 1)
	{
		printf("小端存储\n");
	}
	else
	{
		printf("大端存储\n");
	}
	return 0;
}

在这里插入图片描述


2. 浮点数在内存中的存储

2.1 浮点数的存储形式

上图获取来自百度百科: IEEE 754:浮点数表示

根据上面的资料,那么任意浮点数 V(Value) 可以表示为
在这里插入图片描述

  • (-1) ^ S 表示表示符号位 正负
  • F 表示 大于等于1小于2 的 有效数字
  • 2 ^ E 表示 指数 位(E 是 unsigned int 无符号整数类型)

举例:
十进制数 9.0 转换称二进制为 1001.0,用科学计数法来表示就是 1.001 x 2 ^ 3
那么, S = 0, F = 1.001,E = 3

单精度的浮点数 和 双精度的浮点数 在内存分配的空间是不同的

  • float 类型的浮点数内存分配

在这里插入图片描述

  • double 类型的浮点数内存分配

在这里插入图片描述

2.2 浮点数的 “ 存 ”

2.2.1 S

首个比特位存 S 表示浮点数的 正负(0 或 1)

2.2.2 E

前面我们了解到,E 是一个无符号整数,在 float类型浮点数中有占 8个比特位,取值范围 0 ~ 255,
double类型浮点数中占 11个比特位,取值范围 0 ~ 2047,也就是说 E 是一个非负整数。
但在科学计数法,是允许存在 负数的 E 存在的。

所以,IEEE 754 制定了规定:

E 存入内存时,其真实值必须加上其取值范围的中间数,float类型的为 127,double类型的则为
1023. 比如,2 ^ 8 的 E 是 8,在存入内存时要 + 127 = 135(假设是单精度浮点数类型),即为二进制 10000111

在这里插入图片描述
资料来自百度百科IEEE 754:指数偏差

偏移值就是 内存值(E存入内存值)真实值(E原值) 的差

2.2.3 F

F大于等于1小于2 的,对于任何浮点数都几乎可以表示 1.xxxxxxxxx
“ 存 ” 的时候,F 只存小数部分的 xxxxxxxxx ;在 “ 取 ” 的时候,再把整数部分的 1 加上去

有啥作用?

(假设是单精度浮点数类型)F在存的时候占23位bit,如果把整数的 1 也存进去的话,小数部分能存22位。 但是如果在 “ 存 ”
的时候,F 只存小数部分的 xxxxxxxxx ;在 “ 取 ” 的时候,再把整数部分的 1 加上去,
那就可以节省1位有效数字,小数部分就可以存23位多一位。

2.3 浮点数的 “ 取 ”

2.3.1 S

S (0 或 1)就正常取,是啥取啥就完了

2.3.2 E、F

  • E 不全为 0 或 不全为 1

在这里插入图片描述

这种情况下只要把 E 减去原来加上的中间值127(float)或1023(double)得到真实值的 E
F 把整数部分的 1 加上小数部分即可

  • E 全为 0

在这里插入图片描述

这种情况表示 浮点数是一个接近0的很小的数 或者就是 0
E 减去原来加上的中间值127(float)或1023(double)得到真实值的 E
F 不再加上整数部分的 1 ,而是还原为 0.xxxxxxxxx 的小数

  • E 全为 1
    在这里插入图片描述
    如果 F 全为 0,则表示这是一个 正无穷大负无穷小 的 浮点数(取决于符号位 S
    E 减去原来加上的中间值127(float)或1023(double)得到真实值的 E

3. 浮点数存储例题

#include <stdio.h>
int main()
{
 	int n = 9;
 	float *pFloat = (float *)&n;
	printf("n的值为:%d\n",n);
 	printf("*pFloat的值为:%f\n",*pFloat);
 	*pFloat = 9.0;
 	printf("n的值为:%d\n",n);
 	printf("*pFloat的值为:%f\n",*pFloat);
 	return 0;
}

输出结果是什么?
在这里插入图片描述

为何有这样的变化?

在这里插入图片描述
我们可以看到 指数 E 部分全为0,说明转化后的小数是一个接近0的很小的数,

0.000000000...后面不全为0,但不为0的数也是在非常后面

而我们使用 printf 函数打印浮点数的时候,再没有限定小数位数的情况下, 默认输出小数点后6位
所以我们看到输出结果的第二行就是

*pFloat的值为:0.000000 // 后面的就不输出了

继续往下,为何第二次打印 n 的值,会变得这么大?
在这里插入图片描述
01000001000100000000000000000000 转化为十进制就为 1091567616

  
  
  Stay hungry. Stay Foolish. 饥渴求知,虚怀若愚。
  感谢各位读者支持,虚心请教,如有错漏或可改进点,请任意指出,感激不尽!
  一起进步!


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ISIS的基本概念

1.ISIS概述 IS-IS是一种链路状态路由协议&#xff0c;IS-IS与OSPF在许多方面非常相似&#xff0c; 例如运行IS-IS协议的直连设备之间通过发送Hello报文发现彼此&#xff0c;然后建立邻接关系&#xff0c;并交互链路状态信息。 CLNS由以下三个部分组成&#xff1a; CLNP&#xf…

新的项目springboot

buybuyshenglombok <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency> 添加依赖 lombok package com.example.demo.pojo;import lombok.AllArgsConstructor; import lombok.Data; import …

LLM应用:prompt提示让大模型总结生成Mermaid流程图;充当角色输出

1、prompt提示让大模型总结生成Mermaid流程图 生成内容、总结文章让大模型Mermaid流程图展示&#xff1a; mermaid 美人鱼, 是一个类似 markdown&#xff0c;用文本语法来描述文档图形(流程图、 时序图、甘特图)的工具&#xff0c;您可以在文档中嵌入一段 mermaid 文本来生成 …

项目实战 | 如何恰当的处理 Vue 路由权限

前言 哈喽&#xff0c;小伙伴你好&#xff0c;我是 嘟老板。最近接了一个成本千万级的前端项目运维工作&#xff0c;本着 知己知彼 的态度&#xff0c;我将整个前端的大致设计思路过了一遍。不看不知道&#xff0c;一看…吓一跳。光是 路由权限 这块儿的设计&#xff0c;都让我…

linux上Redis安装使用

环境centOS8 redis是缓存数据库&#xff0c;主要是用于在内存中存储数据&#xff0c;内存的读写很快&#xff0c;加快系统读写数据库的速度 一、Linux 安装 Redis 1. 下载Redis 官网下载Downloads - Redis 历史版本Index of /releases/ 本文中安装的版本为&#xff1a;h…

Celery + redis 异步分布式任务队列安装测试

Celery 异步分布式任务队列 Celery 5.4.0 官方文档 环境&#xff1a;3台 centos7.9 普通用户 redisSchedulerworkerdp951dp96111dp971 文章目录 Celery 异步分布式任务队列1、Celery 介绍2、安装部署2.1 安装消息中间件&#xff08;broker&#xff09;2.2 安装Celery 3、功能…

mac 本地使用docker 运行es,kibana

1.下载 m芯片一些版本不支持.踩过坑.翻看官网才知道只有部分镜像支持m芯片 https://hub.docker.com/添加链接描述 docker pull elasticsearch:7.17.21 docker pull kibana:7.17.21镜像已经下载下来了 2.创建文件映射-挂载 /Users/lin/dev/dockerMsg 其中lin是自己的用户名…

【数据结构/C语言】单链表的实现

目录 一、单链表的基本概念 单链表的简介 单链表的特点 二、预备知识 三、单链表的基本结构 四、单链表的基本操作 1.链表打印 2.申请节点 3.头插 4.尾插 5.头删 6.尾删 7.查找节点 8.指定位置之前插入 9.指定位置之后插入 10.删除给定节点 11.删除给定节点之…

90、动态规划-最长的有效括号

思路&#xff1a; 找出有效括号并且是最长的有效括号 dp[i]表示以i结尾的括号最长是多少 然后从1开始 因为从0位置不管是左括号还是右括号都是无法形成一个完成的括号。所以dp[0]0&#xff1b; 当i1时候&#xff0c;判断括号是否是&#xff09;如果不是那么无法结尾&#x…

cmake进阶:变量的作用域说明一(从函数作用域方面)

一. 简介 如同 C 语言一样&#xff0c;在 cmake 中&#xff0c;变量也有作用域的概念&#xff0c;本文我们就来聊一聊关于 cmake 中变量作用域的问题。 接下来从三个方面进行介绍&#xff1a;函数作用域、目录作用域以及全局作用域。 二. 函数作用域 我把这个作用域叫做函数…

pycharm安装pandas包

import pandas时提示未安装pandas&#xff0c;点击下图红框选项&#xff0c;进行pandas安装 pycharm底部会有安装中的提示 pycharm底部提示红框的内容&#xff0c;说明安装成功 这个时候就可以看到import pandas不再报错了

LeetCode 611. 有效三角形的个数

原题链接&#xff1a;611. 有效三角形的个数 - 力扣&#xff08;LeetCode&#xff09; 题目说&#xff0c;给定一个包含非负整数的数组 num&#xff0c;返回其中可以组成三角形三条边的三元组个数。 示例&#xff1a; nums [4, 2, 3, 4]&#xff1b; 有效组合如下&#xff1a;…

NIO和NIO.2对比

Java NIO (New Input/Output) 是从Java 1.4版本开始引入的一个新的I/O API&#xff0c;用于替代原来的BIO&#xff08;Blocking I/O&#xff09;API。NIO提供了更加灵活和高效的网络通信方式&#xff0c;特别适合于高吞吐量的网络编程。NIO的主要特点是非阻塞模式&#xff0c;它…

数据结构(C):玩转顺序表

&#x1f37a;0.前言 &#x1f3b7;1.线性表 &#x1f3b8;2.顺序表 &#x1f4c0;动态顺序表的实现 &#x1f4bf;初始化 &#x1f4bf;检查容量是否满了&#xff0c;进行扩容 &#x1f4bf;插入&#xff1a;头插和尾插 &#x1f4bf;删除&#xff1a;头删和尾删 &…

Python实现2048游戏

提供学习或者毕业设计使用,功能基本都有,不能和市场上正式游戏相提比论,请理性对待! 在这篇博客中,我们将使用 Python 和 Pygame 库来编写经典的 2048 游戏。2048 是一个益智类游戏,通过在 4x4 网格上滑动方块并合并它们来创建一个新的数字,直到获得数字 2048 或者无法继…

bfs之走迷宫

文章目录 走迷宫广度优先遍历代码Java代码打印路径 走迷宫 给定一个 nm 的二维整数数组&#xff0c;用来表示一个迷宫&#xff0c;数组中只包含 0或 1&#xff0c;其中 0表示可以走的路&#xff0c;1表示不可通过的墙壁。 最初&#xff0c;有一个人位于左上角 (1,1) 处&#…

leetcode-岛屿数量-99

题目要求 思路 1.使用广度优先遍历&#xff0c;将数组中所有为1的元素遍历一遍&#xff0c;遍历过程中使用递归&#xff0c;讲该元素的上下左右四个方向的元素值也置为0 2.统计一共执行过多少次&#xff0c;次数就是岛屿数量 代码实现 class Solution { public:int solve(vec…

mac电脑如何安装python及环境搭建

&#xff08;1&#xff09;进入官网&#xff1a;Download Python | Python.org&#xff0c;根据自己电脑选择python (2)这里我选择的是mac,点击&#xff1a;macos&#xff0c;选择最近版本并点击进入 (3)选择mac版本&#xff1a; (4)点击就可以进入下载&#xff1a; (5)下载好之…

网站防御XSS攻击的有效策略与实施步骤

随着互联网应用的普及与发展&#xff0c;网站安全已成为众多企业关注的焦点&#xff0c;而XSS&#xff08;Cross-Site Scripting&#xff09;攻击作为最常见的Web安全漏洞之一&#xff0c;对用户数据安全构成严重威胁。本文将详细介绍网站如何有效防御XSS攻击&#xff0c;并提供…

Spring JdbcTemplate使用临时表+事务会话管理实现数据新增、查询及自动清除功能

需求描述&#xff1a; 由于某些情况下当查询过滤参数过大时&#xff0c;执行sql由于参数过大而报错&#xff0c;此时 需要使用临时表的方式&#xff0c;即 当参数超过某个阀值&#xff08;如 1000&#xff0c;可调整&#xff09;新增一张临时表&#xff0c;将原表 与 该临时表进…