书海拾遗系列之《C Primer Plus》:第三章 数据和C
目录
printf函数的一点点东西
八进制和十六进制的前缀显示
使用printf()函数以八进制显示的格式为%o,以十六进制显示的格式为%x,而这里要说的是,如果要显示各进制数的前缀o,0x和0X,必须分别使用%#o、%#x和%#X,可以通过下面的代码实现对应效果。
#include <stdio.h>
int main(void)
{
int x = 256;
printf("dec = %d; octal = %o; hex = %x\n", x,x,x);
printf("dec = %d; octal = %#o; hex = %#x\n", x,x,x);
}

无符号以及long类型的打印
而打印long类型的值,需要使用%ld(也就是长整型),这会以十进制形式打印,如果要以八进制或十六进制打印long类型,可以分别使用%lo和%lx。要打印short类型的值,需要使用%hd。具体如下表所示。打印无符号类型时,需要使用%u,这个u可以和其他符号组合使用,例如%lu就是unsigned long十进制显示。
| 类型 | 进制形式 | 转换符 |
|---|---|---|
| long | 十进制 | %ld |
| long | 八进制 | %lo |
| long | 十六进制 | %lx |
| short | 十进制 | %hd |
| short | 八进制 | %ho |
| short | 十六进制 | %hx |
这里需要注意,虽然在使用常量后缀的时候,大小写都可以,也就是说0x25和0X25都是十六进制的25,但在使用%进行转换的时候只能使用小写字母,而且在使用u表示无符号的时候,必须把u放在后面,比如%lu,如果出现%ul会编译报错
换页符(\f)与垂直制表符(\v)
这两个神奇的转义序列,据说在PC屏幕上会生成一些奇怪的符号,不过在Ubuntu 18.04自带的编译器编译出的结果却是这样的:
#include <stdio.h>
int main(void)
{
printf("这是换页符\f和垂直制表符\v123");
}

可见换页符和垂直制表符都有垂直换行的效果,书中说到会产生奇怪的符号,并且光标不会移动,可见对于这两个符号,不同编译器处理方式不同。大多数情况下,只有将其输出到打印机上时才会产生对应描述的效果。
用八进制和十六进制形式表示ASCII码
这是从C90开始就有的表示方法,比如用八进制ASCII码表示一个字符,可以在编码值前面加一个反斜杠(\)并用单引号括起来,下面这几个是等价的:
printf("beep = '\007' = '\07' = '\7'); // 这里的/7也会被解释为八进制ASCII
而十六进制的表示就是用\x加数字,比如表示ASCII中十六进制码10(也就是十进制的16):
printf("Ctrl+P = '\x10' = ’\x010'");
缓冲区的概念
在调用了printf函数后,其实并没有直接将要输出的数据显示到屏幕上,这些数据会先进入一个叫做缓冲区的地方,然后缓冲区内的内容会被系统自动在合适的时候输出到屏幕上,C标准中规定了:当缓冲区满、遇到换行字符或需要输入的时候,就会讲缓冲区中的内容发送到屏幕上,这被称为刷新缓冲区。
可移植类型头文件stdint.h和inttypes.h
这里比较典型的就是int32_t,ti的很多库中使用的32位整型数据类型都是这个,在不同的编译平台都会对该类型进行宏定义,将其定义为平台特定的32位类型,这个类型也被称为精确宽度整数类型,但部分编译器可能不支持这个类型。
和精确宽度整数类型对应的,有一种叫做最小宽度类型的,代表是int_least8_t,它的意思是其对应的类型一定是至少有指定宽度的最小整数类型(这里是8bits宽度)。
浮点型常量
也就是
1.2e5
-3.55e2
这样式儿的,只不过,可以没有小数点,或指数部分,但不能同时省略两者。(要不还是都别省了。。。)。可以省略小数部分,或整数部分,但不能同时省略两者。比如:
// 下面是合法的
2E5
19.278
3.E14
.42E-5
// 下面就是非法的
2.
e5
3.14 e0 // 在e指数和小数之间不能有空格
十六进制浮点数(贼冷贼冷的知识)
C99增加的浮点型常量格式(并不是所有编译器都支持该特性),在十六进制数前加上十六进制的前缀,也就是0x或0X,然后用p或P来代替e/E指数,用2的幂次代替10的幂次(所谓的p计数法),比如:
0xa.1fp10
整数部分,0xa就是10,小数部分1f就是1×1/16+15×1/256,p10就是210,所以这个数也就是(10+1×1/16+15/256)×210=10364.0
本文介绍了《C Primer Plus》第三章关于数据和C的内容,重点讲解了printf函数的使用,包括八进制和十六进制前缀显示、无符号和long类型打印、换页符与垂直制表符的含义,以及ASCII码的八进制和十六进制表示。还提及了缓冲区的概念,以及C99新增的十六进制浮点数表示法。

209

被折叠的 条评论
为什么被折叠?



