(再来聊聊变量)乐创DIY C语言讲义——3.4节
3.4 再谈变量
看完上一下节,相信大家基本上对变量的定义有个基本了解了,接下来我们通过几个编程实例来论证一下上一小节中的结论。
论证:定义有符号变量时,编译器直接存放其补码。
要论证这个题目的思路其实很简单,我们都知道,内存中如果存放无符号类型的数值时,编译器存放的都是其原码,这个是我们下面讨论的前提。而我们现在猜想的是,对于一个有符号数,编译器直接将其补码存入内存单元中。那我们就可以先定义一个无符号类型的变量,然后对其赋值一个有符号类型的数值,再将这个无符号数值用无符号类型的参数打印出来,看其打印结果,就可以证实这个结论是否正确了。好了,思路很明了,接下来就是来编写C语言代码了。新建一个文件夹“3_4_1_datatrans1”,创建.c文件“datastrans.c”,程序代码如图3-4-1所示。
图3-4-1 补码存储实验代码
图3-4-1所示的代码中,为了简单,我们定义了一个无符号的字符型变量,因为它是一个字节的,然后将一个负数-100赋值给这个无符号的变量,由于unsigned char类型表示的范围位-128~+127,因此存入-100也不会是这个变量溢出。赋值完成之后,用printf函数的“%u”控制符,打印出一个无符号类型的变量(最终这个变量就是内存中实际的二进制数)。
接下来编译,运行这份代码,其运行结果如图3-4-2所示。
图3-4-2 补码存储实验运行结果
我们存入的-100,其补码为10011100b,程序运行结果,输出的是156d,转换成二进制是10011100b。这两个结果相同,因此我们之前的结论“定义有符号变量时,编译器直接存放其补码”是正确的。
第二个论证,查看int类型变量内存的排列,等我们后面讲到共用体的时候,再来和大家验证。
变量在每次使用之前,必须要定义,之前C89标准的时候,必须要求在程序语句之前把需要用到的变量全部定义完成,如果在任意一句语句后面定义变量,必定是非法的。而C99则取消了这个规则,允许用户可以在任意地方定义变量,只要这个变量是在使用之前定义的就可以。
+++++++好书推荐++++++
推荐理由:C语言之父丹尼斯·M.里奇(Dennis M.Ritchie)的经典之作,其他废话就不多说了,磨刀不误砍柴功。