浅谈变量的原始值、存储状态、实际值和输出值
计算机用存储单元存储数据(编码后的数据),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)。
分清这几个概念的含义对于正确使用变量意义重大。程序中变量的运算都是基于(存储状态)实际值的。
补充:软件开发 , C语言 ,