C语言_数据在内存中的存储
1. 整数在内存中的存储
计算机中的整数有三种2进制表示方法 :原码、反码、补码。
三种表示方式均有符号位和数值位两个部分,最高一位的是符号位,剩下的都是数值位。符号位用“0”表示“正”,用“1”表示“负”。
正数的原、反、补码都相同。而负整数的三种表示方法各不相同,说明如下:
原码:符号位为“1”,数值位按数值的二进制形式表示
反码:符号位不变,数值位依次按位取反
补码:反码 + 1
对于整形来说,内存中存储的是补码。
为什么呢?
在计算机系统中,数值统一用补码来表示和存储。使用补码,可以将符号位和数值位统一处理;同时,可以将加法和减法统一处理(CPU只需要一个加法器)。补码和原码之间的转换相对简单,不需要复杂的额外硬件电路,这进一步简化了硬件设计。
2. 大小端字节序
2.1 大小端介绍
当存储的数据超过一个字节的时候,就会出现存储顺序的问题,存储顺序分为大端字节序存储和小端字节序存储。说明如下:
- 大端字节序存储:数据的低位字节内容保存在内存的高地址处,而数据的高位字节内容保存在内存的低地址处
- 小端字节序存储:数据的低位字节内容保存在内存的低地址处,而数据的高位字节内容保存在内存的高地址处
为什么会有大小端模式之分呢?
在计算机系统中,每个地址单元都对应着一个字节(byte),一个字节为8bit位,但是在C语言中除了8bit的char以外,还有32bit的int,那对于位数大于8位的处理器,例如32位处理器,由于寄存器宽度大于一个字节,那么必然存在一个字节顺序安排的问题,此时,大端和小端模式应用而生。
2.2 经典练习题
练习1:判断当前机器的字节序
#include<stdio.h>
int check_sys(){int i = 1;return (*(char*)&i);
}int main(){int ret = check_sys();if(return == 1){printf("Xiao");}else{printf("Da");}return 0;
}//check_sys2
int check_sys(){union{int i;int c;}un.i = 1;return un.c;
}
练习2:
#include<stdio.h>int main(){char a = -1;signed char b = -1;unsigned char c = -1;printf("%d\n%d\n%d\n",a,b,c);return 0;
}
练习3:
#include<stdio.h>int main(){char a = -128;printf("%d\n",a);a = 128;printf("%d\n",a);return 0;
}
练习4:
#include<stdio.h>int main(){char a[1000];int i;for(i = 0;i < 1000; i++){a[i]= -1 - i;}printf("%d",strlen(a));return 0;
}
练习5:
#include<stdio.h>unsigned char i = 0;
int main(){for(i = 0;i <= 255;i++){printf("hello world\n");}return 0;
}
#include<stdio.h>int main(){unsigned int i;for(i = 9; i >= 0;i--){printf("%u\n",i);}return 0;
}
练习6:
#include<stdio.h>int main(){int a[4] = { 1, 2, 3, 4 };int *ptr1 = (int *)(&a + 1);int *ptr2 = (int *)((int)a + 1);printf("%x,%x",ptr1[-1], *ptr2);return 0;
}
运行 练习2~6 的代码,思考数据在内存中存储的小细节。
3. 浮点数在内存中的存储
根据国际标准IEEE(电气和电子工程协会)754,任意一个二进制浮点数V可以表示成下面的形式:

例如:
十进制的5.0,写成二进制是101.0,等同于1.01 × 2^2。
按照上方V的格式,可以得出S=0,M=1.01,E=2。
十进制的-5.0,等同于-1.01 × 2^2。
按照上方V的格式,可以得出S=1,M=1.01,E=2。
IEEE754规定:
对于32位的浮点数,最高的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M。

对于64位的浮点数,最高的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M。

3.1 浮点数存的过程
关于有效数字 M:
M的取值范围是1 ≤ M < 2,M可以写成1.xxxxxx的形式,其中xxxxxx表示小数部分。
IEEE 754 规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以不用存储,只保存后面的xxxxxx部分,等到读取的时候再把第一位的1加上去。这样做可以节省1位有效数字。
以32位浮点数为例,留给M的只有23位,将第一位的1舍去之后,等于可以保存24位有效数字。
关于有效数字(指数)E:
E为一个无符号整数(unsigned int)。所以说如果E为8位,它的取值范围为0 ~ 255;如果E为11位,它的取值范围为0 ~ 2047。
众所周知,科学计数法中的E是可以出现负数的,所以IEEE 754规定,存入内存时E的真实值要加上一个中间数,对于8位的E,中间数为127;对于11位的E,中间数为1023。
例如:2^10的E是10,所以保存成32位浮点数时,必须保存成10 + 127 = 137,即10001001。
3.2 浮点数取的过程
指数E从内存中取出有3种情况:
1)E不全为0或不全为1:
浮点数采用上方的规则表示,指数E的存储值减去127(或1023),得到真实值,再将有效值M前加上第一位的1。
例如:0.5的二进制形式为0.1,由于规定正数部分必须为1,即将小数点右移1位,则为1.0 × 2^(-1),其E在内存中的存储值为-1 + 127(中间值) = 126,表示为01111110,而尾数1.0去掉整数部分为0,补齐0到23位为00000000000000000000000,则其表示形式为:
0 01111110 00000000000000000000000
2)E全为0:
浮点数的指数E等于1 - 127(或1 - 1023)即为真实值,有效数字M不再加第一位的1,还原为0.xxxxxx的小数。这样做可以表示 ±0,以及接近于0的很小的数字。
0 00000000 00100000000000000000000
3)E全为1:
如果有效数字M全为0,表示 ±无穷大(S决定正负)。
0 11111111 00000000000000000000000
相关文章:
C语言_数据在内存中的存储
1. 整数在内存中的存储 计算机中的整数有三种2进制表示方法 :原码、反码、补码。 三种表示方式均有符号位和数值位两个部分,最高一位的是符号位,剩下的都是数值位。符号位用“0”表示“正”,用“1”表示“负”。 正数的原、反、…...
华为原生鸿蒙操作系统:我国移动操作系统的新篇章
华为原生鸿蒙操作系统:我国移动操作系统的新篇章 引言 在移动操作系统领域,苹果iOS和安卓系统一直占据主导地位。然而,随着华为原生鸿蒙操作系统的正式发布,这一格局正在发生深刻变化。作为继苹果iOS和安卓系统后的全球第三大移动…...
队列的基本操作(数据结构)
1.实验内容: 编写一个程序sqqueue.cpp,实现环形队列(假设栈中元素类型ElemType 为 char)的各种基本运算,并在此基础上设计一个程序exp4_1.cpp,完成如下功能: 2.实验步骤: (1)初始化队列q (2)判断队列q是否非空 (3…...
linux开机自启动三种方式
方式一、 1:rc.local 文件 1、执行命令:编辑 “/etc/rc.local” vi /ect/rc.local 2、然后在文件最后一行添加要执行程序的全路径。 例如,每次开机时要执行一个 hello.sh,这个脚本放在 / usr 下面,那就可以在 “/et…...
AI创作者与人类创作者的协作模式
公主请阅 1. AI创作者的崛起1.1 AI创作者的工作原理1.2 AI创作者的优势 2. 人类创作者的独特价值2.1 创造性与情感2.2 伦理与价值观2.3 文化与背景 3. AI与人类的协作模式3.1 协同创作3.2 内容编辑3.3 数据驱动的创作3.4 跨媒体协作 4. AI与人类协作的挑战4.1 技术局限性4.2 版…...
FPGA第 13 篇,使用 Xilinx Vivado 创建项目,点亮 LED 灯,Vivado 的基本使用(点亮ZYNQ-7010开发板的LED灯)
前言 在FPGA设计中,Xilinx Vivado软件是一款功能强大的设计工具,它不仅支持硬件描述语言(HDL)的开发,还提供了丰富的图形化设计界面,方便用户进行硬件设计、调试和测试。这里我们将详细介绍,如…...
Kafka文档阅读笔记之基本操作
官方资料 官方首页官方文档基本操作topic的配置参数 topic的部分操作 创建新的topic 命令样例,如下: bin/kafka-topics.sh \--bootstrap-server localhost:9092 \--create \--topic my_topic_name \--partitions 20 \--replication-factor 3 \--conf…...
Golang | Leetcode Golang题解之第506题相对名次
题目: 题解: var desc [3]string{"Gold Medal", "Silver Medal", "Bronze Medal"}func findRelativeRanks(score []int) []string {n : len(score)type pair struct{ score, idx int }arr : make([]pair, n)for i, s : …...
机器学习——元学习(Meta-learning)
元学习(Meta-learning):学习如何学习的机器学习 元学习(Meta-learning),即“学习如何学习”,是机器学习领域中一个令人兴奋且极具潜力的研究方向。它的核心目标是让机器学习系统学会高效地学习…...
【TIMM库】是一个专门为PyTorch用户设计的图像模型库 python库
TIMM库 1、引言:遇见TIMM2、初识TIMM:安装与基本结构3、实战案例一:图像分类4、实战案例二:迁移学习5、实战案例三:模型可视化6、结语:TIMM的无限可能 1、引言:遇见TIMM 大家好,我是…...
【AIGC】从CoT到BoT:AGI推理能力提升24%的技术变革如何驱动ChatGPT未来发展
博客主页: [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 💯前言💯迈向AGI的新跨越💯BoT与CoT的技术对比技术原理差异推理性能提升应用范围和通用性从错误中学习的能力总结 💯BoT的工作流程和机制初始化过程生成推…...
若依部署上线遇到的问题
一、若依部署上线的用户头像模块不能回显: 首先是后端修改部署上线后若依存储图片的本地地址 其次将上线前端配置文件中的图片相关配置给删除 二、若依部署上线后验证码不显示问题 在确保前后端请求打通后还有这个问题就是磁盘缓存问题 三、若依部署上线遇到404页…...
一个vue3的待办列表组件
一个vue3的待办列表组件, 仿企业微信的待办列表 TodoList.vue <template><div><el-input v-model"todoInput" placeholder"写下你的待办事项..." class"el-input" keyup.enter"addTodo"input-style"background-c…...
深入分析梧桐数据库SQL查询之挖掘季度销售冠军
在现代商业环境中,对销售数据的深入分析是企业决策过程中不可或缺的一部分。通过分析销售数据,企业可以识别出表现最佳的员工,从而激励团队,优化销售策略,并提高整体业绩。本文将详细介绍如何使用SQL查询来识别每个季度…...
「ZJUBCA秋季迎新见面会预告」
01 TIME 主席团与各部部长致辞 Presidents and Leads speech 02 TIME Aptos宣讲 Aptos Pitch-Hackathon 03 TIME 破冰小游戏 Icebreaker Games-Mining a Bitcoin 04 TIME 观影 Movie time! ⬇️浙江大学区块链协会秋季迎新见面会预告⬇️ 01 Presidents and Leads s…...
钉钉消息推送工具类
pom.xml <!-- HuTool 工具 --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.12</version></dependency><!-- commons-lang3 --><dependency><groupId>…...
Android Studio 导入/删除/新建库的模块(第三方项目) - Module
文章目录 一、导入module项目 Module空项目如何导入Project工程项目二、删除module项目三、新建module项目(不常用) 一、导入module项目 首先,你必须要有一个工程(Project),才可以打开项目(Module) 第一步骤:右键项目依次点击 New -> Module 1、工…...
flowable 去掉自带的登录权限
重写Security配置,使所有请求都可以通过Security验证。(/**/**) 如: 公共的Security配置 package com.central.workflow.config;import org.springframework.context.annotation.Configuration; import org.springframework.se…...
第T8周:猫狗识别
>- **🍨 本文为[🔗365天深度学习训练营](https://mp.weixin.qq.com/s/0dvHCaOoFnW8SCp3JpzKxg) 中的学习记录博客** >- **🍖 原作者:[K同学啊](https://mtyjkh.blog.csdn.net/)** 🍺 要求: 了解mode…...
第十七周:机器学习
目录 摘要 Abstract 一、MCMC 1、马尔科夫链采样 step1 状态设定 step2 转移矩阵 step3 马尔科夫链的生成 step4 概率分布的估计 2、蒙特卡洛方法 step1 由一个分布产生随机变量 step2 用这些随机变量做实验 3、MCMC算法 4、参考文章 二、flow-based GAN 1、引…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
VisualXML全新升级 | 新增数据库编辑功能
VisualXML是一个功能强大的网络总线设计工具,专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑(如DBC、LDF、ARXML、HEX等),并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...
