c语言科学计数法_C入门:C语言中数据的储存(上)

2bc316f3b4e2f72a42bb9e763546a4ef.png

How Data is stored in computer memory?

储存数据是计算机进行各种数据操作的基础,为了理解计算机可以对哪些数据进行怎样的操作,有必要了解数据在计算机中的储存方式。

f698c39cfeca9f9b4500d15006b401fd.png

为了有效防止失真,提高数据的准确性和稳定性,计算机使用二进制的方式来储存数据(关于精妙的底层逻辑,建议参考清华大学王红老师的课程《数字电子技术基础》),0和1便是计算机逻辑语言,相应的采用两段范围电压的相对高低(高电平,低电平)来用于机器语言,很多情况下我们采用高电平对应1的正逻辑。理解数据的二进制储存,就时在探讨各种数据与二进制数据之间的转换。

我们通常讲每一个储存0或1的最小内存单元称作位(bit),将连续的8位称作一字节(Byte)。如上图所示。

最初我们多用计算机储存数值类数据。常见的数字量数据,在C语言中我们有int(integer)和int的各种派生数据unsigned int,long int,short int....又是需要表示模拟量,然而实现模拟量和二进制的转换是不现实的,于是用浮点型数据float,double来近似表示模拟数据,根据误差要求选择不同精度的浮点型数据。随着发展,我们对储存文字信息的需求越来越大,相应的有char类型数据来表达常用字符,随着计算机在世界范围的普及,char所能表示的字符已经远远不够了,于是有了各种各样的char类型的扩充,也有了更多的国际码制标准。

How integers are stored in memory?

3447b9da3d1ba58f720b6210071c2251.png

实现二进制和十进制的转换是容易的,将十进制整数a转换为二进制表示所需最小位数位n,只需n与a之间满足

。然而为了表示符号位,必须要再多一位来表示符号。这又造成了问题,编码的时候符号位应该放到哪里?译码的时候如何识别符号位?

前人智慧的积累,最终计算机使用一种特殊的编码方式来储存整数。

以最高位(MSB ,most significant bit)作为符号位,MSB=0表示正数,反之表示负数。这样的编码方式不仅易于计算机理解符号,而且其所具有的正负数特有的补码关系使得减法运算变得容易。

2405a17bdf2a18691ad740a0b0763364.png

如上图,+10用二进制表示为1010,要得到-10只需将1010各位取反然后再加1(即补码),如果将两者相加会发现在有效位数内和为0。(关于补码建议听王红老师的课)。这种编码方式对计算机是有好的,取反(反向器)加1(加法器)都是可硬件实现的。将负数以补码的形式表达将减法运算转换为求和运算,也使得硬件实现变得可能。

以此逻辑,4byte的int型数据表示范围为

~
,将符号位当作数值位的unsigned int表示的范围为
~

How character is stored in Computer

char型数据本质上和 int 相同,都是储存二进制整数值,在计算机看来,他们仅仅是 size 和 range 不同罢了( int 4字节,char 1字节),进行运算处理的方式完全一样。我们常常觉得char和 int 差别很大,因为我们在创建一个char数据时更多用于输入输出到屏幕或文件,当使用有关函数时,会对 cha r数组做特殊处理并且以ASCII码做相应的转换。char 并不神秘。

7ef07b8dd48f5a7560a367cce85a0860.png

ASCII码是我们最常用的字符码制了,如果要处理更多字符(例如汉字)的话,还需要去了解国际上更全面的码制。

How float or double values are stored in memory?

2fd62fa91e800cf0a908da04802d4d42.png

以float(单精度浮点型)为例,分配4字节(32位)内存

由1bit符号位,8bit指数位和23bit有效位构成。

3a8210bab083c28c1ef3f18701e34b94.png

可以看到double和float只是不同部分位数的区别,本质是相同的,接下来以float为例介绍。

## How to convert floating numbers into binary numbers ?

浮点型数据转换为二进制会有些不同,因为小数部分和二进制并非11对应的,就像0.5无法用2^n^(n为整数)来表示,这就造成了精度问题,相应的便有单精度float和双精度double数据来应对不同的误差要求。

为了搞明白小数部分的二进制表示,我们先回顾十进制

e.g. 我们如何理解4.23

		4.23整数部分为4;4.23小数部分为0.23;如何获得小数点后第一位数据,只需将其x进制数0.23x10=2.3我们可得到第一位为2再将0.3x10=3我们得到第二位为3

可以看到将小数部分每x一次n进制,就会有一次整体的进位。此时得到的小数点前的第1位即为刚才小数点后的第一位

同样的思路操作二进制

e.g.

4.23整数部分为4--->100;
小数部分为0.23;
0.23x2=0.46--->0
0.46x2=0.92--->0
0.92x2=1.84--->1
0.84x2=1.68--->1
0.68x2=1.36--->1
0.36x2=0.72--->0

显然我们得到了一个无限不循环小数100.001110.....

这样我们就把浮点类数据表示成了二进制数据

## Make the converted binary number to normalize form

为了在计算机中储存这些数据,我们需要将其规范化,一般化

如上例子100.001110.......=1.00001110....x2^2^

其中1.100001110....为significant bit,将决定浮点数的精度

2^2^(*指数那个2*)为exponent bit,将决定浮点数的范围

我们终于表达了浮点数的大小(*鼓掌*)

然而如何表示负值,浮点数是没有补码反码这种操作的。同样的以MSB的取值来表示符号,特殊的是,将exponent bit在加上

,即添加一个较大的正数部分使之无论正负均为正值。如上例子1.00001110....x
,其exponent bit最终结果为
+1=129.

由于我们采用科学计数法(*我想应该是这么称呼的吧*)表示,而且是二进制只有0和1,那么形式总会是1.xxxxx,无需浪费一位来表示小数点之前的1,所以在计算机储存浮点类型数据时,是不会储存这一位的。

d3c29e9ddbedf2633ba647d2f5f12eab.png

0.75在计算机中的储存形式。

根据这个储存方式不难得出,float的最大精度为

,可表示最大数值为

note:**关于这样表示浮点数据的原理及其计算和输出输出方法我还没搞明白,我再研究研究再写吧,当然希望已经搞明白的小伙伴分享一下啦**

一只小白猿,技术超有限......

还望小伙伴能指出小白猿的错误,一起学习,一起分享

0d5fe83a46ecb40617d971621632a245.png
微信扫描二维码关注小白猿啦

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tf.layers.dense

tf.layers.dense( inputs, units, activationNone, use_biasTrue, kernel_initializerNone, bias_initializertf.zeros_initializer(), kernel_regularizerNone, bias_regularizerNone,activity_regularizerNone, trainableTrue, nameNone, reuseNone ) 各参数含义:…

java 修改 枚举类字段_枚举枚举和修改“最终静态”字段的方法

java 修改 枚举类字段在本新闻通讯中,该新闻通讯最初发表在Java专家的新闻通讯第161期中,我们研究了如何使用sun.reflect包中的反射类在Sun JDK中创建枚举实例。 显然,这仅适用于Sun的JDK。 如果需要在另一个JVM上执行此操作,则您…

tf.reduce_mean

tf.reduce_mean(input_tensor, axisNone, keep_dimsFalse, nameNone, reduction_indicesNone) 作用:沿着张量不同的数轴进行计算平均值。 参数:input_tensor: 被计算的张量,确保为数字类型。 axis: 方向数轴,如果没有…

display函数怎么使用_使用网络构建复杂布局超实用的技巧,赶紧收藏吧

前端开发工程师必读书籍有哪些值得推荐?我们直接进入代码,如下所示,先写些标签,源码在这个链接里面:https://codepen.io/Shadid/pen/zYqNvgvHeader Aside 1 Section Aside 2 Footer在上面,我们创建了一…

安装后jdk1.8 配置环境变量以后 版本显示还是1.7

配置图如下 1.7版本不用卸载 不用就可以了 转载于:https://www.cnblogs.com/roujiamo/p/10836593.html

为@Cacheable设置TTL – Spring

今天,我被要求为应用程序正在使用的某些键设置缓存的过期时间,因此我Swift开始寻找Spring Cacheable表示法提供的所有选项,以设置过期时间或生存时间。 由于Spring没有提供任何可配置的选项来实现它,因此,我利用固定延…

tf.equal

tf.equal(A, B)是对比这两个矩阵或者向量的相等的元素,如果是相等的那就返回True,反正返回False,返回的值的矩阵维度和A是一样的 import tensorflow as tf import numpy as np A [[1,3,4,5,6]] B [[1,3,4,3,2]] with tf.Session() a…

校验输入框的内容不能重复_答应我,用了这个jupyter插件,别再重复造轮子了

以下文章来源于Python大数据分析 ,作者费弗里1 简介在使用Python、R等完成日常任务的过程中,可能会经常书写同样或模式相近的同一段代码,譬如每次使用matplotlib绘制图像的时候可以在开头添加下面两行代码来解决中文乱码等显示问题&#xff1…

P2387 [NOI2014]魔法森林

和最小差值生成树差不多 都是用lct维护生成树的题目 本题可以以a排序,再维护b(通常这种二维变量的题都差不多这样,先排序一维) 然后我tm竟然rotate手误打错了一点...调了好久.. 然后关于pushup:关于最大值,…

C# float/double 减 float/double 等 (X.xxxxxxxxxxxxxE-07)(黑盒测试)

问题 因为没有深究原理,所有只进行了“黑盒测试” 黑盒测试结论: 问题操作结论float/double运算进过一系列的运算后大概率 ! 0.0 , 而是等于0.00000000000xxxx等于X.xxxxxxxx一串数字的时候不影响下一步继续使用当需要显示fl…

ABP的新旧版本

新版本 https://abp.io/documents/abp/latest/Index https://github.com/abpframework/abp ABP is an open source application framework focused on ASP.NET Core based web application development, but also supports developing other types of applications. 旧版本…

tensorflow的优化器Optimizer

种类如下,其中Optimizer是基类tf.train.Optimizertf.train.GradientDescentOptimizertf.train.AdadeltaOptimizertf.train.AdagradOptimizertf.train.AdagradDAOptimizertf.train.MomentumOptimizertf.train.AdamOptimizertf.train.FtrlOptimizertf.train.ProximalG…

python3支持中文_彻底颓了—— Vim Python 3 接口不支持中文 - Jacky Liu's Blog

折腾了好久才编译出来一个支持 Python 3 的 Vim,谁知居然有这么多问题。 除了 vim.current.buffer 对象不再支持 slice 类型参数以外,今天又发现这个: :py3 vim.current.buffer.append(XXX 模块的控制面板) 结果在 Vim 里加进去的一行看起来是…

如何处理班级过多的问题

在几乎所有我解释了 面向对象程序设计 观点的演讲中,都有人分享这样的评论:“如果我们遵循您的建议,我们将有很多小类。” 我的回答总是一样:“我们当然会的,那太好了!” 老实说,即使您不能考虑…

java护照号码校验_学无止境之小白学java……第001天

学习主题:预科阶段对应视频:http://www.itbaizhan.cn/course/id/18.html 对应作业:1. 为什么需要学编程,什么样的人可以做程序员?编程是现实逻辑的表达,编程对数学和英语要求并不高。2. 本行不行&#xff0…

mfc通过信号量保证线程同步

1、声明一个全局handle,记住在cpp里也声明 extern HANDLE uiHandle; 2、创建信号量 uiHandle CreateSemaphore(NULL,1,1,NULL); 3、使用 线程1:WaitForSingleObject(uiHandle,INFINITE); a;//在这里访问同一对象 ReleaseSemaphore(uiHandle,1,NULL); 线程2&#xf…

python字典和集合双向索引_Python字典和集合

字典和集合基础字典是一系列无序元素的组合,其长度大小可变,元素可以任意的删减和改变。不过,这里的元素是一堆键(key)和值(value)的配对。 集合没有键和值的配对,是一系列无序的、唯…

ITK读取图像

//读取png图像#include "itkImage.h" #include "itkImageFileReader.h" #include "itkImageFileWriter.h" #include "itkPNGImageIOFactory.h" #include "itkJPEGImageIOFactory.h"int main(int argc, char ** argv) {typed…

documentFragment深入理解

documentFragment是一个保存多个element的容器对象(保存在内存)当更新其中的一个或者多个element时,页面不会更新。只有当documentFragment容器中保存的所有element更新后再将其插入到页面中才能更新页面。 documentFragment用来批量更新 列如…

在React中处理事件

在使用React渲染RESTful服务后,我们创建了一个简单的UI,用于渲染从RESTful服务获取的员工列表。 作为本文的一部分,我们将扩展同一应用程序以支持添加和删除员工操作。 我们将通过添加/删除员工操作来更新react-app后端api,并修改…