C语言中整型浮点型在计算机中的存储
第一次写博客,遣词造句有点菜,算是一次简单梳理,慢慢学习人家的博客风格,随着学习的深入再做修改。
本次学习的是C语言在VS下的编译调试,对于初学者两说,首先说一下如何监控变量,以及监控变量在内存中的存储与表示。
1. 如何监控变量
首先从最基本的程序说起,先看一段代码,
#include<stdio.h>int main()
{int i;for (i = 0; i <= 5; i++)printf("%d\n",i);return 0;
}
这样很简单的一段代码,我们想随时监控变量i的值的变换以及在内存的变化,应该如何去做的,首先VS中按F10进入调试状态,依次打开调试->窗口->监视->监视1,如下图所示
在编辑窗口的下方会出现如下的对话框,在名称下面输入i,依次按F10就可以监控变量,这种方式在我们以后的编程查错时会很方便。
2.如何查看变量在内存中的变化
还是上面的简单程序,按F10进入调试状态,和上述步骤相似,依次打 调试->窗口->内存->内存1,然后出现如下窗口,窗口大小位置都可以进行修改,自己尝试。
此时我们只需要点击窗口中最下面的内存1和监视1,就可以对变量i的值和内存的监控的随意切换。但是我们还需要在上面的窗口的地址栏输入i的地址才可以进行监控,输入&i
,然后回车。此时地址栏显示的地址即为i在计算机的存储地址,然后依次按F10即可监控i对应的地址中值的变化
按几次F10之后,我们会看到i此时的值为1,下面是此时i的值的监视,和i在内存地址中的值
我们发现i此时值为1,那i在内存中的值是什么呢,看上面内存监视,第一行0x004FFEDC后面对应的八个数字,01 00 00 00 ,我们知道计算机的存储是二进制存储,但是二进制表示的话会很长,不利于观察和计算,于是编译器就把二进制数转化成十六进制表示出来,又计算机是小端模式(读者自行了解),所以将01 00 00 00的十六进制转化成十进制就是1.我们同样的方式再来看一下其他数值是否符合这个规则。稍改一下程序,让i的循环终止时候的值是20,如下图
需要解释的一点是,我刚刚把for循环括号里面i<=5,改成了i<=20,此时重新编译,所以地址改变,但是不影响对内存中值的监视,此时我们看到,当i的值为20时,对应地址中的值是14 00 00 00化成十进制就是20.大家可以按照这个方式,设计一些程序去检测一下。
3.浮点型在计算机中的存储
在探讨float的存储呢之前可以先说一下整型在计算机内存中的存储是补码形式,大家可以自行试验一下,包括负数的存储呢形式,这里不再熬述。
有了上述的基础之后,我们在讨论浮点型在计算机中是如何存储的。
首先明白两个前提条件 (1)实型数据在计算机中以指数的形式保存
(2)float在计算机中占四个字节,符号位1位,指数位8位,尾数位23位
我们还是通过简单的例子看看计算机是如何存储的
#include<stdio.h>int main()
{float i;i = 0.5;return 0;
}
我们看到当i的值为0.5时,其对应的二进制数是0.1,指数表示应该是1.0*2^-1内存中的值是00 00 00 3f,将它转换成大端存储为3f 00 00 00,再转化成二进制数为0011 1111 0000 0000 0000 0000 0000 0000,按照float数据的存储方式可以将其划分为1个符号位,8个指数位,和23个尾数位的形式,则其为0 01111110 00000000000000000000000
我们知道符号位没错是0,但是尾数为啥全部为零呢,这是因为,float存储时,不论怎么做,小数点后面总会出现一个1,这样计算机就默认一个1.这样就可以提高一个位的精度。在解决了这个问题以后,我们又要问了,那指数位也不符合我们的要求啊。我们把指数位的数转化成十进制数为01111110(二进制)->126(十进制)
这是怎么回事呢,指数不是应该是-1吗,这和我们的126有什么关系吗,不难发现126=127+(-1)
根据以上分析我们得到计算机存储float的两个推断(1)尾数部分处理成了1.xxx * 2^n的形式
(2)指数部分在原有的基础之上加127
下面来举例验证一下我们的推论是否正确比如0.25,转化成二进制就是0.01,根据我们的推论,将其转换成指数形式就是1.0 * 2^(-2),那么尾数位还全部是0,则指数位应该是-2+127=125,125的二进制表示应该是0111 1101,那么0.25(十进制)在内存中的表示应该是0 01111101 00000000000000000000000 我们来通过程序验证一下,
0.25在内存中的表示为00 00 80 3e,将其装换成小端模式为3e 80 00 00,再将其转化成二进制为 0 01111101 00000000000000000000000,和上述我们的推断一致,证明推断正确。此时又会问了为什么会采用这种方式进行存储呢?如果直接按照指数的存储形式,采用补码的话,我们必须要思考两个数字0.0和1.0如何存储,0.0毋庸置疑是全0,可是1.0按普通补码的形式,应该是1.0*2^0指数部分也应该是全0,但是这样不就和0.0矛盾了吗,所以需要才要指数加127的操作。接下来我们验证一下0.0和1.0在计算机内存中是如何存储的。
0.0
0.0是全0
1.0
1.0是00 00 80 3f转化成小端是3f 80 00 00再转化成二进制是0 01111111 00000000000000000000000再将指数位转化成十进制是127.此时可以说我们的结论正确了。
综上,float在计算机内存中采取以下方式进行存储
1. 尾数部分处理成了 1.xxxx * 2^n的格式
2. 指数部分在原有指数的基础上加了 127
以上文字仅是个人拙见,错误之处,还望大家指正,本人也会深入学习,争取在文字表达还有正确性上面更精准一些。
相关文章:

判断交换机性能好坏的九个因素
【文章摘要】把握千兆交换机的主要性能指标是关键,而判断交换机性能的好坏,需要从以下几方面的因素出发... 把握千兆交换机的主要性能指标是关键,而判断交换机性能的好坏,需要从以下几方面的因素出发: 转发技术 …

xgboost回归预测模型_偏最小二乘回归分析法 从预测角度对所建立的回归模型进行比较...
在实际问题中,经常遇到需要研究两组多重相关变量间的相互依赖关系,并研究用一组变量(常称为自变量或预测变量)去预测另一组变量(常称为因变量或响应变量), 除了最小二乘准则下的经典多元线性回归分析(MLR),提取自变量组主成分的主…

win7的IE缓存,临时文件,cookies和历史记录
2019独角兽企业重金招聘Python工程师标准>>> vista、win7的缓存以及临时文件、Cookies和历史记录都在以下几个地方: 缓存: %userprofile%\AppData\Local\Microsoft\Windows\Temporary Internet Files Temp: %userprofile%\AppData\Local\Temp Cookies: %…

Sql Server函数全解(四)日期和时间函数
阅读目录 1.获取系统当前日期的函数getDate();2.返回UTC日期的函数UTCDATE()3.获取天数的函数DAY(d)4.获取月份的函数MONTH(d)5.获取年份的函数YEAR(d)6.获取日期中指定部分字符串值的函数DATENAME(dp,d)7.获取日期中指定部分的整数值的函数DATEPART(dp,d)8.计算日期和时间的函…

关于python的比赛_【蓝桥杯】——python集团的比赛技巧,Python,组
【蓝桥杯】—— Python组比赛技巧蓝桥杯是大学生IT学科赛事,由工业和信息化部人才交流中心主办,所以对于大学生还说还是非常值得去参加的,2020年第十一届蓝桥杯新增了大学Python组,不分组别,第一届没有历届的真题&…

杭电 HOJ 1312 Red and Black 解题报告
搜索,bfs。依旧用队列做。边界处懒得处理,全部初始化为-1。当然,0也可以。AC代码如下: #include<iostream> #include<deque> using namespace std;struct Point {int x,y; } x,y;int main() {char str[22];int i,j,n,…

pfile和spfile的区别
pfile和spfile的区别 pfile 默认的名称为“init例程名.ora”文件路径:/app/oracle/product/10.2.0/dbs,这是一个文本文件,可以用任何文本编辑工具打开。spfile 默认的名称为“spfile例程名.ora”文件路径:/app/oracle/product/10…

json操作2
import jsonfopen(a.txt,w,encodingutf-8)goods{ 宝马:111111, 奔驰:222222}resjson.dumps(goods,ensure_asciiFalse)#把字典转成jsonf.write(res) json.dump(goods,f,ensure_asciiFalse)#把字典转成json,json会帮你write一次 ----颜色不一样的代码一致运行结果ÿ…
缓冲区和数组的输入输出问题
最近编写程序的时候一直被数据的输入输出所困扰,由此写篇博文总结一下最近遇到的问题和解决方法,错误之处望指正。 1.数组使用的一些语法注意事项 (1)数组的定义 一维数组:类型名 数组名 [常量表达式] 常量表达式中可…

目前python主要应用领域零售_python3读取HDA零售企业数据(一)
#-*- coding:utf-8 -*-# 下载河南FDA各药品经营企业目录import urllib.requestimport urllib.parseimport reimport osimport http.cookiejarheader {Connection: Keep-Alive,Accept: application/x-ms-application, image/jpeg, application/xamlxml, image/gif, image/pjpeg…

调试webservice遇到“测试窗体只能用于使用基元类型作为参数的方法”的解决办法...
之前一直写webservice 没有遇见这种情况,因为一般返回的参数整形 字符串 之类的 都是基本类型,最多也就是把xml序列化为一个字符串返回,这次遇到了返回一个引用类型的,不能直接调试了。所以,现在只能写一个程序把webse…

EJB3.1 JBoss7.1 Eclipse3.7
为什么80%的码农都做不了架构师?>>> EJB3.1 JBoss7.1 Eclipse3.7 ------Hello World 一、环境配置: JDK:正常配置 Eclipse:正常下载,解压(V3.7) JBoss:正常下载…

NOIP2012-摆花
放题目不解释~~~~ 【试题描述】 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆。通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号。为了在门口展出更多种花,规定第i种花不能…

github提交代码却没有显示绿格子
在github上提交代码之后,进入github上面查看自己的提交,可以看看刚刚的提交内容,但是却一直没有显示绿格子,一个原因是本地git的配置邮箱和github上面的邮箱不一致。 解决办法是,打开本地的git bash,然后直…

spark+openfire即时通讯工具二次开发参考文档
摘自: http://gmd20.blog.163.com/blog/static/168439232010527525542/ 其中Spark是开源的基于XMPP协议的即时通讯工具,公司最近也换到用这个了,说是在服务器(openfire)上可以备份消息,然后可以看员工的聊天记录 smac…

python selenium 等待页面加载完毕_Selenium_等待页面加载完毕
隐式等待WebDriver driver newFirefoxDriver();driver.get("www.baidu.com");driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);WebElement element driver.findElement(By.cssSelector(".abc"));((JavascriptExecutor)driver).executeS…

TechEd 2012奥兰多!
亚特兰大TechEd 2011如同昨天的事情,今天又无比期待奥兰多的TechEd 2012!如果可能的话,我将继续为大家分享关于奥兰多TechEd 2012 的现场见闻! 转载于:https://blog.51cto.com/suhua/845796

【常见CPU架构对比】维基百科
Comparison of instruction set architectures https://en.wikipedia.org/wiki/Comparison_of_instruction_set_architectures转载于:https://www.cnblogs.com/timeObjserver/p/9441242.html
Python基础学习1(Python的Windows和Linux的安装及简单学习)
一Python的安装 1.Windows下安装Python (1)windows 命令行的几个常见的命令 dir:查看当前目录下的所有文件,以及目录 cd NAME:进入到NAME目录下(tab键自动补全) D: 切换到D盘 type NUL…
Python Tutorial(十):浏览标准库(一)
10.1 操作系统接口 os模块提供很多函数用于和操作系统的交互: 确定使用import os风格而不是from os import *。这将避免os.open()被内建的open()函数遮住,它的操作截然不同。 内建的函数dir()和help()作为交互助手对于大的模块像os是非常有用的ÿ…

学业水平考试b能上985吗_河南单招哪些学院好考?哪些专业能录取?
高职单招的录取规则是什么?在符合报考条件的前提下,考试是由两部分组成:文化素质评价职业适应性测试、职业技能测试。文化素质评价大多院校采用学业水平考试等级成绩折合一定的分值计入。有些学校采用现场考试语数外三门,以实际成绩计入。职…

单例模式Java实现
为什么80%的码农都做不了架构师?>>> public class Singleton {private static Singleton instance null;// 同步时加锁的静态对象private static final Object OL new Object();private Singleton() {// Class initialize}/** 在多线程环境下执行时的…

Go环境搭建、Sublime Text 3 安装Go语言相关插件gosublime
Go 语言环境安装 1.brew install go 默认安装,被安装了/usr/local/Cellar/go 目录并自设置了环境变量。 2.go env 可查看目前的go的环境变量 3.配置一个GOPATH环境变量,是工作目录。 根据约定,GOPATH下需要建立3个目录: bin 存储编…

ABAP性能实例七例
一、SQL Interface 1.Select ... Where vs. Select Check 用Select … Where语句效率比Select Check语句要高,例如: SELECT * FROM SBOOK INTO SBOOK_WA WHERE CARRID LH AND CONNID 0400. ENDSELECT. SELECT * FROM SBOOK INTO SBOOK_WA. CHECK: SB…

C语言中打印‘%’
C语言中打印‘%’不能直接printf("%"),这里的%有特殊含义的,要想打印的话,需要输入printf("%%"),两个%才可以将它打印出来。C语言中的其他的特殊字符,以后再慢慢做整理。

vba 字体颜色_多掌握一些VBA语句,让自己书写代码更加顺畅
VBA 是好东西,对于身在职场的人员,或者是积极打拼的创业者,是数据分析的首选,他可以实现量身定做,解决一些规律性强的问题。或者代替人处理一些可以描述出有逻辑关系的数据分析。多掌握一些VBA语句,让自己书…

编写jQueryUI插件(widget)
使用jQueryUI的widget来写插件,相比于基本的jquery插件有一些好处: * 方便实现继承,代码重用 * 默认是单例 * widget已经给你实现好的一些常用方法,例如destroy 带来好处的同时也带来了荆棘和陷阱,本文的目的就是梳理这…

mail 发送email
(一)首先安装ssmpt和mailutils: sudo apt-get install ssmtp mailutils (二)接下来编辑配置文件sudo gedit /etc/ssmtp/ssmtp.conf rootYOUR_PERSONAL_MAILDOMAIN mailhubsmtp.gmail.com:465 rewriteDomaingmail.com A…

C语言中字符型在计算机中的存储
一. 字符型的分类和表示范围 char:是有符号还是无符号数视编译器而定,一般为有符号数,下文把它全部当成有符号数进行讨论 表示范围:32位和64位机器上均是一个字节,所以是八个bit位,最高位为符号位之后&…

python中正确的表达式_python中如何正确使用正则表达式的详细模式(Verbose mode expression)...
简单介绍正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大。得益于这一点,在提供了正则表达式的语言里,…