当前位置: 首页 > news >正文

C语言数据在内存中的存储

文章目录

    • 一、整形在内存中的存储
        • 1、无符号整数。
        • 2、有符号整数。
    • 二、大小端字节序
    • 三、练习
        • 练习1:
        • 练习2:
    • 四、浮点数在内存中的存储
        • 1、浮点数的存储
        • 2、浮点数存的过程
        • 3、浮点数取的过程

一、整形在内存中的存储

整形在内存中存储分为有符号和无符号,即signed int有符号整数,unsigned int无符号整数,int 在VS中是默认有符号的。

1、无符号整数。

存储无符号整数时,把整数转换为二进制的形式存储在内存中,当使用时直接取出来使用。

2、有符号整数。

在有符号整数中,把最高位当作符号位,0表示正数,1表示负数。
在存储时有符号整数引入了原码,反码,补码的概念。

正整数的原、反、补码都相同。
负整数的三种表示方法各不同。

原码:直接将负数最高位为1,值翻译成二进制形式。
反码:将原码除符号位外,按位取反。
补码:反码+1得到补码。

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

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

二、大小端字节序

计算机在内存中存储的数据分为大端存储和小端存储。

大端存储:数据的高字节内容保存在内存的低地址处,数据的低字节内容保存在高地址处。

小端存储:数据的高字节内容保存在内存的高地址处,数据的低字节内容保存在低地址处。

判断当前编译器是大小端字节序方法

#include<stdio.h>
int judge_the_size()
{int a = 1;return *((char*)&a);
}
int main()
{if (judge_the_size()){printf("小端字节序\n");}else{printf("大端字节序\n");}return 0;
}

在这里插入图片描述

三、练习

练习1:
#include <stdio.h>
int main()
{char a= -1;signed char b=-1;unsigned char c=-1;printf("a=%d,b=%d,c=%d",a,b,c);return 0;
}

char类型的取值范围为-128~127
a 和 b 在取值范围内类型相同,结果都为-1
c类型为无符号char类型,取值范围为0~255
-1给unsigned char 赋值
-1在内存中的存储补码为1111111
用%d打印时整形提升补0
结果255

在这里插入图片描述

练习2:
#include <stdio.h>
int main()
{char a = -128;printf("%u\n", a);return 0;
}

char类型存储-128
在内存中的补码为1000000
在用%u打印整形提升时补1
11111111 11111111 11111111 10000000
结果为这个二进制的值

在这里插入图片描述
在这里插入图片描述

四、浮点数在内存中的存储

1、浮点数的存储

浮点数家族包括: float、double、long double 类型。

V = (−1) S * M ∗ 2E
• (−1) s表⽰符号位,当S=0,V为正数;当S=1,V为负数
• M表⽰有效数字,M是⼤于等于1,⼩于2的
• 2 表⽰指数位

对于32位的浮点数,最高的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M
在这里插入图片描述

对于64位的浮点数,最高的1位存储符号位S,接着11位存储指数E,剩下的52位存储有效数字M
在这里插入图片描述

2、浮点数存的过程

在存时会把M转换成大于等于1,小于2的小数,移动小数位所以称为浮点数,对应E的值改变,存储M时只存储小数点后的数。
对指数E存储时E位8位时,加上中间值127然后存入内存中。
在E为11位时,加上中间值1023。

3、浮点数取的过程

分为三种情况:
(1)E不全为0或全为1

这时浮点是取的过程M加1,E如果在存时+127,取时就-127.
怎么存就反着取出来

(2)E全为0

这时,浮点数指数E的真实值等于1-127(或者1-1023),有效数M不再加1,直接还原为0.xxxxxxx的小数,这样为了表示±0,以及接近于0的很小的数字。

(3)E全为1

如果有效数M全为0,表示±无穷大


相关文章:

  • 【论文精读】DCRNN-扩散图卷积循环神经网络
  • PCL 多边形缩放操作
  • CentOS 7基础操作11_用户账号和组账号概述
  • Ubuntu的启动过程
  • 为何数据仓库需要“分层次”?
  • 常见排序算法,快排,希尔,归并,堆排
  • 免费插件集-illustrator插件-Ai插件-文本对象合并
  • Python爬虫要掌握哪些东西
  • 《手把手教你》系列练习篇之12-python+ selenium自动化测试(详细教程)
  • pottery,一个超酷的 Python 库!
  • 足球俱乐部管理系统的设计
  • 【TS】进阶
  • 19、Go Gin框架集成Swagger
  • 解决 iOS 端小程序「saveVideoToPhotosAlbum:fail invalid video」问题
  • 机器学习-支持向量机
  • 【RocksDB】TransactionDB源码分析
  • Centos6.8 使用rpm安装mysql5.7
  • ES6 ...操作符
  • go append函数以及写入
  • leetcode98. Validate Binary Search Tree
  • Odoo domain写法及运用
  • React 快速上手 - 07 前端路由 react-router
  • Redis字符串类型内部编码剖析
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • storm drpc实例
  • Transformer-XL: Unleashing the Potential of Attention Models
  • Vue.js-Day01
  • Webpack 4x 之路 ( 四 )
  • webpack入门学习手记(二)
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 嵌入式文件系统
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 中文输入法与React文本输入框的问题与解决方案
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • 阿里云服务器如何修改远程端口?
  • 函数计算新功能-----支持C#函数
  • #NOIP 2014#Day.2 T3 解方程
  • $ git push -u origin master 推送到远程库出错
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (bean配置类的注解开发)学习Spring的第十三天
  • (poj1.2.1)1970(筛选法模拟)
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (七)Java对象在Hibernate持久化层的状态
  • (十五)使用Nexus创建Maven私服
  • (一)u-boot-nand.bin的下载
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)Unity3DUnity3D在android下调试
  • (转)大道至简,职场上做人做事做管理
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端