博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浅谈变量的原始值、存储状态、实际值和输出值
阅读量:4144 次
发布时间:2019-05-25

本文共 1253 字,大约阅读时间需要 4 分钟。

计算机用存储单元存储数据(编码后的数据),C语言中用变量标识计算机中的存储单元。

C语言中有long i,j;i=1;j=-1;,则相应的计算机中就有四个字节的整型变量,其存储状态为00000000000000000000000000000001(十六进制形式为00000001)和11111111111111111111111111111111(十六进制形式为ffffffff)。因此,说变量i和变量j的存储状态为00000001和ffffffff。因为变量的类型已经固定,所以它们的实际值也是固定的。

计算机采用二进制,整数、小数或字符编码后的数据都是01串,不同类型的数据可能对应于同一个编码,因此,计算机中的存储状态究竟代表什么数据不能确定,只有确定了类型才能确定值。

C语言中i+j,从字面意思上理解为1+-1值为0。计算机中实际的执行过程却是00000001+ffffffff得到00000000,结果为整数0的编码。

在查看变量的输出结果时,printf函数可以将相关数据的存储状态解码成“整数”呈现给用户,printf解码出的数据就是输出值。printf函数不会考虑相关变量的类型只根据自己的格式字符来解码数据,因此,用printf函数输出的变量的值不一定就是变量的实际值。如语句printf("%ld,%lu\n“,j,j);的输出结果为-1,4294967295

总结起来,变量的存储状态固定,实际值固定,输出值可能有多个。

可以用printf函数输出整型数据的存储状态。格式字符o以八进制形式输出整型数据的存储状态,而格式字符X(x)可以十六进制形式的输出存储状态。(通常大家对这两个格式字符的作用有误解。)

浮点型数据的存储状态比较复杂,通常不输出也不分析。

浮点型变量的实际值通常非常长,且有些是无效数字,因此容易被人忽略。浮点型变量的实际值与程序中赋的原始值多数情况下有误差,强调它的实际值意义重大。用printf函数输出让浮点型数据的许多位(如20位),在输出数据中最后的数字将全是0,因此,除去最后的0前面的数据就可以认为是浮点型数据的实际值。如有float fa = 0.1;  double fb = 0.1;   printf("%.20f,%.20f\n", fa, fb);,则程序的输出(VC6.0)为0.10000000149011612000,0.10000000000000001000,因此,变量fa的原始值为0.1,实际值为0.10000000149011612;变量fb的原始值为0.1,实际值为0.10000000000000001。

浮点型数据的输出值,多为实际值保留小数点后几位小数的结果。

整型变量的原始值和实际值也会出现误差,如有short j=50000;则变量j的原始值为50000,实际值肯定不会是50000(它的实际值最大只能是32767)。

分清这几个概念的含义对于正确使用变量意义重大。程序中变量的运算都是基于(存储状态)实际值的。

转载地址:http://tcdti.baihongyu.com/

你可能感兴趣的文章
详解Unity Profiler内存分析问题
查看>>
玩转Unity资源、对象及序列化(上)(下)
查看>>
Unity UI优化技术与技巧
查看>>
如何优化UGUI的ScrollRect
查看>>
Unity中所有特殊的文件夹
查看>>
c#中的反射
查看>>
Unity官方教程|使用Raycast显示射击轨迹
查看>>
Unity 2D教程 | 骨骼动画:介绍
查看>>
Unity 2D教程 | 骨骼动画:创建动画
查看>>
Unity断言库
查看>>
Unity着色器教程 | 积雪效果
查看>>
手把手教你在Unity中实现小地图
查看>>
Unity 动态加载Animator Event 事件
查看>>
Unity中的时间控制 - 关卡创建
查看>>
Unity中的时间控制 - 时间倒退
查看>>
Unity开发小技巧介绍
查看>>
揭开AssetBundle庐山真面目(一)(二)
查看>>
那些你与AssetBundle的爱与恨...
查看>>
你应该知道的AssetBundle管理机制(内存管理较适合于Unity 5.3之前的版本)
查看>>
Unity3D 5.X 新版AssetBundle使用方案及策略
查看>>