1、显示八进制数和十六进制数
要用八进制而不是十进制显示整数,用%o代替%d。
要显示十六进制数,使用%x。
要显示C前缀,可以使用说明符%#o、%#x和%#X,分别生成0、0x和0X前缀。
例如:
1 #include<stdio.h>
2 int main(void)
3{
4 int x=100;
5 printf("dec = %d;octal = %o;hex = %x\n",x,x,x);
6 printf("dec = %d;octal = %#o;hex = %#x\n",x,x,x);
7
8 return 0;
9 }
显示结果为:
1 dec = 100;octal = 144;hex = 64
2 dec = 100;octal = 0144;hex = 0x64
2、整数溢出
分别将有符号类型和无符号类型整数设置为最大允许值,然后溢出。例如:
1 #include<stdio.h>
2 int main()
3{
4 int i = 2147483647;
5 unsigned int j = 4294967295;
6
7 printf("%d %d %d\n",i,i+1,i+2);
8 printf("%u %u %u\n",j,j+1,j+2);
9
10 return 0;
11 }
显示结果为:
1 2147483647 -2147483648 -2147483647
2 4294967295 0 1
3、打印short、long和unsigned类型整数
如果系统的int和long类型具有同样的长度,使用%d可以打印long数值,但可移植性比较差。建议使用%ld打印long型。
%lx表示以十六进制格式打印长整数,%lo表示以八进制格式打印长整数。
%hd表示以十进制显示short整数,%ho表示以八进制显示short整数等。如:
1 #include<stdio.h>
2 int main()
3{
4 unsigned int un = 3000000000;
5 short end = 200;
6 long big = 65537;
7
8 printf("bytes of short :%d\n",sizeof(short));
9 printf("bytes of int :%d\n",sizeof(int));
10 printf("bytes of long :%d\n",sizeof(long));
11 printf("un = %u and not %d\n",un,un);
12 printf("end = %hd and %d\n",end,end);
13 printf("big = %ld and not %hd\n",big,big);
14
15 return 0;
16 }
显示结果为:
1 bytes of short :2
2 bytes of int :4
3 bytes of long :4
4 un = 3000000000 and not -1294967296
5 end = 200 and 200
6 big = 65537 and not 1
①无符号数3000000000和有符号数-1294967296在内存中的表示方法是一样的。比如65537按照二进制格式为
00000000 00000001 00000000 00000001,在printf中使用%hd说明符使它只显示后16位,00000000 00000001;
②short显示结果相同,因为在传递参数的时候C自动把short类型的值转为int类型。
4、打印转义字符
例如要打印:"Gramps sez,"a \ is a blacklash. "
可以为:
1 #include<stdio.h>
2 int main()
3{
4 printf("Gramps sez.\"a \\ is a blackslash. \"\n");
5
6 return 0;
7 }
5、什么时候用ASCII码,什么时候用转义字符呢?
应当使用转义序列,比如选择'\f'而不是'\014'。首先,转义字符容易记忆,其次可移植性更好。
6、float、double和long double
float类型必须至少能表示6位有效数字。double至少能表示10位有效数字。
float类型中,通常,使用32位存储一个浮点数,其中8位存储指数及其符号,24位用于表示非指数的部分及其符号。
如果存储指数的位数增加,那么该浮点数的表示范围比较大;如果存储非指数部分及尾数的位数增加,可以提高精度。
可以通过f或F后缀使编译器把浮点常量当做float类型,如2.3f和9.11F。l或L后缀为long double类型,如54.3l和4.32e4L.打印浮点数
例如:
1 #include<stdio.h>
2 int main()
3{
4 float aboat=32000.0;
5 double abet=2.14e9;
6
7 printf("%f can be written %e\n",aboat,aboat);
8 printf("%f can be written %e\n",abet,abet);
9
10 return 0;
11 }
显示结果为:
1 32000.000000 can be written 3.200000e+004
2 2140000000.000000 can be written 2.140000e+009
7、格式说明符的数目和类型对应
例如:
1 #include<stdio.h>
2 int main()
3{
4 int f=4;
5 int g=5;
6 float h=5.0f;
7
8 printf("%d\n",f,g); //参数太多
9 printf("%d %d\n",f); //参数太少
10 printf("%d %f",h,g); //值类型不对
11
12 return 0;
13 }
显示结果为:
注意,使用%d显示float值不会把该float值转换为近似的int值,而是显示垃圾值。与之类似,使用%f显示int值也不会把该int值转换为float值。
8、刷新输出
C规定一下情况将缓冲区的内容传给屏幕:
a、缓冲区满
b、遇到换行符
c、需要输入的时候
解决方法:
a、使用fflush()函数
b、用换行符刷新缓冲区
c、当前面有print()函数要输出的内容时,可以使用scanf()函数,迫使printf()输出的内容被传给屏幕。