随笔 - 56, 文章 - 0, 评论 - 0, 引用 - 0
数据加载中……

数据和C

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    }

   显示结果为:
1    4
2    4 5
3    0 0.000000
    注意,使用%d显示float值不会把该float值转换为近似的int值,而是显示垃圾值。与之类似,使用%f显示int值也不会把该int值转换为float值。

8、刷新输出
    C规定一下情况将缓冲区的内容传给屏幕:
    a、缓冲区满
    b、遇到换行符
    c、需要输入的时候
 
    解决方法:
    a、使用fflush()函数
    b、用换行符刷新缓冲区
    c、当前面有print()函数要输出的内容时,可以使用scanf()函数,迫使printf()输出的内容被传给屏幕。

posted on 2011-03-06 18:47 八路 阅读(279) 评论(0)  编辑 收藏 引用 所属分类: C primer 易错点


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理