整数和浮点数在内存中存储

整数在内存中的存储

整数的2进制表⽰⽅法有三种,即原码、反码和补码。

对于整形来说,数据存放内存中的其实是补码。

在计算机系统中,数值一律用补码来表示和存储。原因是,使用补码,可以使符号位和数值域统一处理,同时,还可以使加法和减法统一处理(CPU中只有加法器)。此外,原码和补码相互转换,运算过程相同,不需要额外硬件电路。

大小端存储

⼤端(存储)模式:是指数据的低位字节内容保存在内存的⾼地址处,⽽数据的⾼位字节内容,保存在内存的低地址处。
⼩端(存储)模式:是指数据的低位字节内容保存在内存的低地址处,⽽数据的⾼位字节内容,保存在内存的⾼地址处。


为何存在大小端?

大小端之分主要源于计算机系统中多字节数据的存储顺序问题。在计算机系统中,每个地址单元对应着一个字节,而一个字节为8位。然而,对于位数大于8位的处理器,如16位或32位的处理器,寄存器宽度大于一个字节,因此需要将多个字节进行排列。

#include <stdio.h>
  int check_sys()
{
    int i = 1;
    return (*(char *)&i);
}
  int main()
{
    int ret = check_sys();
    if(ret == 1)
{
    printf("⼩端\n");
}
 else
{
    printf("⼤端\n");
}
    return 0;
}

联合体:

int check_sys()
{
 {
  int i;
  char c;
  }un;
 un.i = 1;
 return un.c;
}

550ddf8cec4e4e4889c1e5b0a8556cf7.jpeg

 浮点数在内存中的存储

int main()
{
  int n = 9;
  float *pFloat = (float *)&n;
  printf("n的值为:%d\n",n);
  printf("*pFloat的值为:%f\n",*pFloat);
  *pFloat = 9.0;
  printf("num的值为:%d\n",n);
  printf("*pFloat的值为:%f\n",*pFloat);
  return 0;
}

在这个程序中,输出为9 0.000000 一个很大的数值 9.000000

任意⼀个⼆进制浮点数V可以表⽰成下⾯的形式:
V = (-1) ^S*M*2^E 
• (-1)^S 表⽰符号位,当S=0,V为正数;当S=1,V为负数
• M表⽰有效数字,M是⼤于等于1,⼩于2的
• E 表⽰指数位

02c128691c3b4ae092c477af91065182.png

79ad25f2b37144c3b486efd7e352dade.png 在计算机内部保存M的时候,默认第一位总是1,所以可以舍去,只保留后面的部分。等到读取的时候,再把第⼀位的1加上去。这样做的⽬的,是节省1位有效数字。以32位浮点数为例,留给M只有23位,将第⼀位的1舍去以后,等于可以保存24位有效数字。

E为一个无符号整数,但是科学计数法中的E是可以出现负数的。等到读取的时候,再把第⼀位的1加上去。这样做的⽬的,是节省1位有效数字。以32位浮点数为例,留给M只有23位,将第⼀位的1舍去以后,等于可以保存24位有效数字。

指数E从内存中取出可以再分成三种情况:

E不全为0或不全为1:

指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第⼀位的1。

E全为0:

浮点数的指数E等于1-127(或者1-1023)即为真实值,有效数字M不再加上第⼀位的1,⽽是还
原为0.xxxxxx的⼩数。这样做是为了表⽰±0,以及接近于0的很⼩的数字。

E全为1:

如果有效数字M全为0,表⽰±⽆穷⼤(正负取决于符号位s)。
为什么 9 还原成浮点数,就成了 0.000000 ?
9以整型的形式存储在内存中,得到如下⼆进制序列:

1 0000 0000 0000 0000 0000 0000 0000 1001

最后23位的有效数字M=00000000000000000001001。
由于指数E全为0,所以符合E为全0的情况。因此,浮点数V就写成:
   V=(-1)^0 × 0.00000000000000000001001×2^(-126)=1.001×2^(-146)
显然,V是⼀个很⼩的接近于0的正数,所以⽤⼗进制⼩数表示就是0.000000。

浮点数9.0,为什么整数打印是 1091567616?

⾸先,浮点数9.0等于⼆进制的1001.0,即换算成科学计数法是:1.001×2^3
所以:9.0 = (-1) *(1.001) ∗ 2^3。

那么,第⼀位的符号位S=0,有效数字M等于001后⾯再加20个0,凑满23位,指数E等于3+127=130,即10000010,
所以,写成⼆进制形式,应该是S+E+M,即0 10000010 001 0000 0000 0000 0000 0000

练习

signed char所有的最高位被当作符号位,剩下的为数值位。内存中存放的数据为补码。最前面为1,是负数。符号位不变,其他位置按位取反再+1。

aa4174fee4a44320a3d0f632514c9a11.png

unsigned char 0-255

e9032379440c4ec9a8b649d3dd1352ec.png

 

这三种类型,在内存种存储时的补码是相同的,都是11111111。char类型要提升为int类型才能打印,整形提升的时候要补充符号位111111111111111,打印-1。signed char同理。unsigned0000000011111111,打印256。

 

打印的是无符号数。-128是1000000001000000%u打印认为a中存储的是无符号数,首先要整型提升。其在内存中的补码为1111 1111 1111 1111 1111 1111 111。打印的值是二进制补码所对应的十进制。128放入就不是128了,因为signed int所存储的值是-128~127。只能存8个比特位10000000。高位补1,1111111110000000。unsigned是无符号是但是用%d,又被当作无符号类型。

#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;
}

求得的是字符串的长度,并且是\0(asc码值为0)之前的长度。ea6a648aeb0a478787cec5f0fc2f67c8.jpg

 顺序为-1 -2 -3 ……-128 127 126 ……0。一共有255个数字。

 

#include <stdio.h>
int main()
{
  unsigned int i;
  for(i = 9; i >= 0; i--)
  {
     printf("%u\n",i);
   }
  return 0;
}

unsigned char只能存到255,取值范围为0-255。永远大于等于0,所以永远成立。

#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;
}

相当于整型加整型。

4 20000000

 

 

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

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

相关文章

ARMday7

VID_20240322_203313 1.思维导图 2.main.c #include"key_inc.h" //封装延时函数 void delay(int ms) {int i,j;for(i0;i<ms;i){for(j0;j<2000;j){}} } int main() {//按键中断的初始化key1_it_config();key2_it_config();key3_it_config();while(1){printf(&q…

备战蓝桥杯Day34 - 每日一题

题目描述 解题思路 1.输入数据n&#xff0c;并将字符串类型转换成整数类型 2.求出输入n是2的几次幂&#xff08;调用math库中的求对数的方法&#xff09;&#xff0c;在下面的循环中要用到 3.定义sum和&#xff0c;将抽取到的牌的总数加起来存储 4.count 0 # 记录 2 的第几…

台达变频通过Modbus转Profinet网关可以在环网冗余中使用

Modbus转Profinet网关&#xff08;如XD-MDPN100&#xff09;是一种能够实现Modbus协议与Profinet协议之间转换的设备。它支持Modbus RTU协议和Profinet协议还支持MRP环网冗余系统&#xff0c;,可以通过配置软件进行协议转换&#xff0c;使得原本只能使用Modbus协议的设备可以与…

微服务day05(中) -- ES索引库操作

索引库就类似数据库表&#xff0c;mapping映射就类似表的结构。 我们要向es中存储数据&#xff0c;必须先创建“库”和“表”。 2.1.mapping映射属性 mapping是对索引库中文档的约束&#xff0c;常见的mapping属性包括&#xff1a; type&#xff1a;字段数据类型&#xff0c;…

中兴通讯服务器荣获滴滴“最佳需求响应「和衷共济」奖”

在数字经济加速发展的背景下&#xff0c;算力成为数字产业的核心支撑力量&#xff0c;而服务器和存储产品更是为互联网创新体验提供了底层基础设施保障。在此背景下&#xff0c;中兴通讯服务器产品有效支撑滴滴出行智慧交通解决方案&#xff0c;凭借卓越表现&#xff0c;获得滴…

QGraphicsView的使用,view坐标,scene坐标,item坐标

Graphics View绘图构架 QGraphicsScene&#xff08;场景&#xff09;&#xff1a;可以管理多个图形项QGraphicsItem&#xff08;图形项&#xff09;&#xff1a;也就是图元&#xff0c;支持鼠标事件响应。QGraphicsView&#xff08;视图&#xff09;&#xff1a;关联场景可以让…

基于python+vue学生作业管理系统flask-django-nodejs-php

快速发展的社会中&#xff0c;人们的生活水平都在提高&#xff0c;生活节奏也在逐渐加快。为了节省时间和提高工作效率&#xff0c;越来越多的人选择利用互联网进行线上打理各种事务&#xff0c;然后线上管理系统也就相继涌现。与此同时&#xff0c;人们开始接受方便的生活方式…

IDEA/Android Studio格式化代码快捷键失效的解决

问题描述 用AS写一个项目的时候&#xff0c;发现CtrlAltL的格式化快捷键并不生效&#xff0c;按下之后没有任何反应。而格式化文件快捷键CtrlAltShiftL依旧生效&#xff0c;难道是设置出了问题&#xff1f; 打开设置页面发现快捷键设置很正确&#xff0c;并没问题&#xff0c…

掌握C语言结构体,开启编程新世界

✨✨欢迎&#x1f44d;&#x1f44d;点赞☕️☕️收藏✍✍评论 个人主页&#xff1a;秋邱博客 所属栏目&#xff1a;C语言 &#xff08;感谢您的光临&#xff0c;您的光临蓬荜生辉&#xff09; 前言 前面我们也涉及到了结构体的讲解&#xff0c;但是只是粗略的讲了一下。 接下…

力扣hot100题解(python版91-95题)

91、不同路径 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&…

java分割等和子集(力扣Leetcode416)

分割等和子集 力扣原题链接 给你一个只包含正整数的非空数组nums。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 示例 1&#xff1a; 输入&#xff1a;nums [1,5,11,5] 输出&#xff1a;true 解释&#xff1a;数组可以分割成 [1, 5, 5] …

【深度学习基础知识】IOU、GIOU、DIOU、CIOU

这里简单记录下IOU及其衍生公式。   为了拉通IOU及其衍生版的公式对比&#xff0c;以及方便记忆&#xff0c;这里用一个统一的图示来表示出所有的参数 【&#xff21;】目标框的区域【&#xff22;】预测框的区域【&#xff23;】&#xff21;与&#xff22;的交集【&#xff…

关于TEMU 亚马逊美国哺乳枕(Nursing Pillow)法规16 CFR 1242介绍

美国首个哺乳枕法规16 CFR 1242发布 美国消费品安全委员会CPSC于2023年9月26日在联邦公报上发布了哺乳枕新法规16 CFR 1242的草案&#xff0c;旨在降低哺乳枕使用带来的伤害和死亡风险。该法规草案提到了在使用哺乳枕时由于婴儿睡着或无人看护而导致的窒息、陷落和跌落风险。在…

2024:RAG年

如果 2023 年都是关于 ChatGPT 和 Llama-2 等基础LLM&#xff0c;那么我的预测是 2024 年将是关于检索增强一代&#xff08;RAG&#xff09;的。 在这篇博文中&#xff0c;我阐述了为什么 RAG 将在 2024 年飞速发展&#xff0c;不仅是企业采用率&#xff0c;而且消费者采用率也…

BigDecimal类的使用,用于精确计算任意精度的数字

BigDecimal类 BigDecimal 是 Java 中用于精确表示任意精度的十进制数的类。在很多情况下,使用基本数据类型(如 double 或 float)进行浮点数计算可能会导致精度丢失或舍入错误。BigDecimal 提供了一种更精确的解决方案,可以处理需要高精度计算的场景,比如财务应用或科学计算…

记录解决问题--activiti8.2 流程图图片由png改为svg前端不显示图片问题

1.说明 如果是vue svg显示&#xff0c;请查阅其他标准资料&#xff0c;类似使用svg标签。我这里讲的另外一种情况&#xff0c;链接返回的是svg文件&#xff0c;需要用v-html显示图片。 2.activiti6流程图图片格式 ①png格式。可以查看链接返回&#xff0c;以png开头。 ②前端…

蓝桥杯练习——神秘咒语——axios

目标 完善 index.js 中的 TODO 部分&#xff0c;通过新增或者修改代码&#xff0c;完成以下目标&#xff1a; 点击钥匙 1 和钥匙 2 按钮时会通过 axios 发送请求&#xff0c;在发送请求时需要在请求头中添加 Authorization 字段携带 token&#xff0c;token 的值为 2b58f9a8-…

适合新生儿的奶瓶有哪些?五款高分新生儿奶瓶分享!

每一个有新生儿的家庭都一定会挑选奶瓶&#xff0c;但是因为市面有太多品牌和款式&#xff0c;让大家难以挑选&#xff0c;更为重要的是还有可能会不小心选到劣质的产品&#xff0c;不仅奶嘴的仿真度差、易胀气&#xff0c;还可能高温消毒后散发有害物质&#xff01;那么新生儿…

力扣 字符串解码

维护一个放数字的栈&#xff0c;一个放字母的栈 遇到[把数字和字母入栈&#xff0c;遇到]把当前字母循环加上数字栈头遍的字母栈头 class Solution { public:string decodeString(string s) {string ans"";stack<int>sz;stack<string>zm;里面是string …

2024 年 AI 辅助研发趋势将更加强调智能化、自动化和个性化

目录 前言 AI辅助研发的技术进展 行业应用案例 医药行业 汽车行业 电子行业 面临的挑战与机遇 技术挑战 伦理问题 数据安全 机遇和解决方案 未来趋势预测 1. 深度融合AI与研发流程 2. 智能研发平台的崛起 3. 强化AI与人类智慧的融合 前言 当谈到人工智能&#xff…