且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

《C语言程序设计:问题与求解方法》——3.7节各种类型的常量

更新时间:2022-09-23 16:20:34

本节书摘来自华章社区《C语言程序设计:问题与求解方法》一书中的第3章,第3.7节各种类型的常量,作者:何 勤,更多章节内容可以访问云栖社区“华章社区”公众号查看

3.7 各种类型的常量
与变量类似,常量实际上也有多种细分的类型。在C语言中变量需要先定义类型才能在语句中使用,而常量有默认的类型。
数值末尾不添加类型说明符的整型常量默认为是int型的。超出int型范围的整型常量,默认为是long型的。也就是说,整型常量1234一定是int类型的,而整型常量123467(超过了32767)在int型最大值是32767的系统中是long型的。
数值末尾不添加类型说明符的浮点型常量默认为是double型的。也就是说,任意一个浮点型常量,不论是小数形式表示的,还是指数形式表示的,只要数的末尾没有加类型说明符F(或者f),一律被编译程序当成是double型的常量。
如果默认的类型不合适,可以在常量的末尾加上类型说明符。
对于整型常量,可在末尾加U表示无符号整型或加L表示长整型;在整型常量的开头,还可加上进制说明符,以0开头表示八进制整数,0x或0X开头表示十六进制整数。
对浮点型常量,在末尾可加F(或f),表示该常量是单精度浮点型。
(1)数值常量的存储类型(初学时不必看)
与基本类型变量一样,常量也分为三大类型:字符型、整型和浮点型。除了字符型常量比较简单外,常量根据在内存中存储方式(参见本章提高部分)的不同,可细分为很多类型。所有常量的(不同存储)类型请参见表3-2:
表3-2 各种常量类型


《C语言程序设计:问题与求解方法》——3.7节各种类型的常量

说明:说明常量类型的字符U、L、F都可以用小写字符u、l、f,多个类型符号连在一起书写时,符号之间的顺序是任意的。比如,123UL、 123LU、123ul都是一样的。
总之,数值末尾不添加类型说明符的整型常量(比如123)默认是int型的,但是该数的值如果超出了int型的范围,那么该数默认是long型的;不添加类型说明符的实型常量(比如123.34)一定是double型的。
其他强制指定的常量类型一般很少使用。强制指定常量类型常常是为了减少程序运行时的类型转换。比如在变量定义时,使用“float x = 123.3F;”就比使用“float x = 123.3 ;”要好,前者避免了一次不必要的运行时的类型转换。
(2)数值常量的多种机外书写形式(初学时不必看)
上表中对常量的分类,是一种本质上的分类,因为上表中各种不同的常量在内存中的存储方式不同(参见本章提高部分)。但是,常量还可以根据在源程序中的书写(或输入输出中的)形式来进行分类。
上一章已经讲过,浮点型常量有两种书写形式:十进制小数形式和十进制指数形式。如,小数形式123.45和指数形式1.2345e2,在内存中其实是具有完全相同存储形式的浮点数(默认为double型的)。它们仅仅是在程序中(或输入输出时)的表现形式不同而已。再加上不同的存储形式(double型与float型),数值大小相同(取值不超过float型范围)的浮点型常量一共有4种机外表示形式:123.45、1.2345e2、123.45f、1.2345e2f。
整型常量在C语言源程序中(或程序运行的输入输出时),除了可以用十进制形式书写(或输入输出)之外,还可以使用八进制和十六进制形式来书写(或输入输出)。
八进制整型常量:常量中只包含数字0~7,用0开头表示的数都是八进制整型常量。比如,034、065、–013。
十六进制整型常量:常量中包含数字0~9和字符a~f(或者用A~F),以0x(或0X)开头的,都是十六进制整型常量。比如,0x3d、 0XEF、–0x8a等。
同一个十进制整数123(默认为int型),还可以用八进制整数0173来表示,或者用十六进制整数0x7B来表示。它们也仅仅是在程序中(或输入输出时)的表现形式不同而已,在计算机内部,它们是形式完全相同的二进制整数0000000001111011(假设int型占2个字节)。再加上不同的存储形式(int、long、unsigned、unsigned long),数值大小相同且值不超过int范围的整型常量一共有3×4=12种机外表示形式:123、123L、123U、123UL、0173、0173L、0173U、0173UL、0x7B、0x7BL、0x7BU、0x7BUL。
八进制和十六进制整数主要应用在系统编程和嵌入式编程方面(主要原因在于:机外形式的八进制和十六进制整数与机内形式的二进制整数之间很容易进行相互转换)。如果一个二进制整数中的n个位分别用来表示n个开关的状态,在用C语言编程时,那么就***使用无符号的八进制整数(或无符号十六进制的整数)来表示此二进制整数,C语言的源程序中无法直接使用二进制整数。