c primer plus_Chapter_There数据和c

1、%f用来处理浮点值,%.2f的.2用于控制精确输出,输出的浮点数只显示小数点后两位;

2、scanf使用&找到变量的地址;

3、Char类型可以表示较小的整数,long double也可以表示小数;

4、c语言的关键字:int unsigned double float char short long;  signed void(c90);_Bool  _Complex(复数)_Imaginary(虚数)(c99);

5、计算机把浮点数分成小数部分和指数部分来表示,而且分开储存这两部分;在十进制下,0.7写成0.7e1。0.7是小数部分,1是指数部分;计算机在内部使用二进制和2的幂进行储存;

6、对于一些算数运算(如两个很大的数相减),浮点数损失的精度更多。

7、以浮点格式(十进制)储存Π的值

        +              .314159          1

     符号                 小数          指数(x 10^1)3.14159

8、因为两个整数之间由无穷个实数,所以计算机的浮点数不能表示区间内所有的值,浮点数通常只是实际值的近似值,7.0可能被存为6.999999999;

9、声明变量(创建内存空间),初始化变量(赋值),不含小数点和指数的数作为整数;

10、printf(“”,)逗号后面的参数可以是变量名和常量,没有写参数前面的输出将是一个内存中的随机值;

11、十六进制的每一位数由4个二进制位表示,

%d  十进制显示;%o 八进制显示;%x 十六进制显示;

显示各进制数的前缀%#o(八进制前缀0),%#x,%#X(16进制前缀0x);

 12、八进制和16进制常量被视为int类型,如果值太大,编译器会尝试使用unsigned int,如果还不够大,编译器会依次使用long,unsigned long, long long 和unsigned long long类型;

有些情况下需要编译器以long类型存储一个小数字,可以在数字后面加上L;例如:020L,0x10L;类似的可以加LL来表示long long 类型的值;U的后缀表示unsigned long long;

例如:5uLL;10LLu;6LLU;9ULL;

unsigned int 类型的变量超过最大值是从0开始。而int类型的变量是从-2147483648开始;

13、打印unsigned int 类型的值,用%u 转换说明,打印long类型用%ld;如果long和int在系统中大小相同,用%d即可;在x或o前面使用 l 前缀,%lx:16进制格式打印long类型的正数,%lo表示八进制打印long类型整数;

        对于short类型可以使用h前缀,%hd表示十进制显示short类型整数,%ho表示八进制显示short类型整数;

        h和 l 前缀可以和u一起使用表示无符号类型;%lu:打印unsigned long 类型的值;%lld,%llu;

(1) 无符号值30000000000和有符号值-1294967296相同;内存中的表示完全相同;

(2)c编译器在给函数传递参数时,会把short类型的值自动转化成int类型的值;(int类型是计算机处理整数类型时最高效的类型)(使用h修饰符可以显示较大整数被截断成short类型值得情况);

(3)把65537写成二进制是0000 0000 0000 0001 0000 0000 0000 0001;%hd只会查看后16位,所以显示值为1;

(4)%ld只显示后32位的值;

14、char用于储存字符,从技术层面看,char是整数类型,char实际存储的是整数,计算机以字符编码来处理字符,ascll码;65--A;ascll范围是0--127,7bit即可容纳;有些字符集已经超过了127,甚至多于255;char是8bit;所以创建了unicode字符集,最后改进为utf-8;

char = 'a';如果省略 '' 编译器会认为a是变量名,用双引号则被认为是字符串;

15、char为有符号时为-128----127,无符号为0-255;

16、_Bool类型

        true(1)/false(0);实际上也是整数类型,原则上只占一位空间;

17、c99可移植类型:stdint.h和inttypes.h

        c语言为现有的类型创建了更多类型名,这些新的类型名定义在stdint.h中。例如:int32_t,表示32位的有符号整数类型。在32位系统中,把int32_t作为int的别名,int为16位,long为32位的系统把int32_t作为long的别名;(int32_t被称为精确宽度整数类型(exact-width integer type))

int32_t表示整数类型刚好是32位,但计算机系统可能不支持;

        c99和c11提供了第二类别名集合,一些类型名保证所表示的类型一定是至少有指定宽度的最小整数类型(被称为最小宽度类型(minimum width type))。例如int_least8_t是可容纳8位有符号整数值的类型中宽度最小的类型的一个别名;如果系统最小整数类型为16位,可能不会定义int8_t,

但系统仍可以使用int_least8_t类型,但可能把该类型实现为16位的整数类型;

        最快最小宽度类型(fastst minimum width type): 是一种计算达到最快的类型集合,例如:int_fast8_t被定义为系统中对8位有符号值而言运算最快的整数类型的别名。

        系统最大整数类型:(c99)intmax_t;        uintmax_t 最大的无符号整数类型;

c99和c11还提供了相应的输入和输出,提供了一些字符串宏,来显示可移植类型,例如:inttypes.h头文件定义了PRId32字符串宏(代表打印32位有符号值的合适转换说明(如d或l));

18、浮点数(类似于科学计数法)

数字                                        科学计数法                                 指数计数法

1000000000                           1.0 * 10^9                                     1.0e9

123000                                    1.23 * 10^5                                   1.23e5

0.00056                                   5.6 * 10^-5                                    5.6e-5

----------------------------------------------------------------------------------------------------------

float类型至少能表示6位数字,取值范围至少是10^-37----10^37;

通常,一个系统储存一个浮点数要32位,其中8位用于表示指数的值和符号,剩下的24位用于表示非指数部分(叫尾数或有效数)及其符号;

double与float的最小取值范围相同,但double至少必须能表示10位数字,一般情况下,double占64位,一些系统将多出的32位全部用来表示非指数部分,一些系统把其中的一些位分配给指数部分,以容纳更大的位数,无论哪种double都至少有13位有效数字;

浮点型常量的基本形式是有符号的数字加e或E,最后一个是有符号数表示10的指数;即用指数计数法;

double类型的浮点数常量使用双精度进行乘法运算,然后将乘积截断成float类型的宽度,在浮点数后加f或F后缀可覆盖默认设置,编译器会将浮点型常量看作float类型,如2.3f和9.11E9F;加 l 或L

使数字成为long double类型,如54.31L或4.32l;没有后缀的浮点常量是double类型;

        c99用十六进制表示浮点型常量;前缀加上0x,p代替e,2的幂代替10的幂;

例如:0xa.1fp10    (a ==10,.1f是1/16 + 15/256,p10是2^10)     所以该值是(10  + 1/16 + 15/256 )* 1024 = 10364.0;

打印

        %f(十进制) %e(指数计数法)十六进制可以用a或A替代e和E;

        long doule 用 %Lf、%Le、%La;

        给未在函数原型中显示说明参数类型的函数例如printf();c语言编译器会把float 类型自动转化为double类型;

浮点值的上溢(overflow)和下溢(underflow)

        overflow:数字过大,超出当前能表达的范围,c语言规定,在这种情况下会给toobig赋一个表示无穷大的值,printf()显示为inf或infinity;

        underflow:当除以一个很小的数字时,float是以指数和尾数部分来储存。存在一个指数部分是最小值,即全部可用位来表示最小尾数值,(该数字是float类型能用的全部精度表示的最小值),现在把它除以二,通常会减小指数部分,但指数已经是最小值,计算机只能把尾数部分右移,空出一个二进制位,丢弃最后一个二进制数,例如0.1234E-10除以10,得到的结果是0.0123E-10。计算过程中失去了原末尾的有效数字,叫下溢;c语言把损失精度的浮点值称为低于正常的(subnormal)浮点值,如果除以一个很大的值最终所有的位都为0;

        NaN(not a number的缩写),另一个特殊的浮点值,例如给函数传值,该函数将返回一个角度,该角度的正弦是传入函数的值,但正弦值不能大于1,如果传入参数大于1,该函数的行为是未定义的,这种情况下该函数返回NaN的值;

浮点数的舍入错误

        给定一个数,加1,再减去原来的数,浮点运算会给出不同1的答案;

 复数和虚数类型

        c11标准复数软件包是可选项,

        c语言的3种复数类型:

                float_Complex,

                        该类型的变量包括两个float类型的值,分别表示复数的实部和虚部;

                double_Complex,

                long double_Complex;

        c语言的3种虚数类型:

                float_Imaginary:

                double_Imaginary:

                long double_Imaginary:

        如果包含了complex.h的头文件,可以使用complex替代_Complex,用imaginary替代_Imaginary;用 I 替代 -1的平方根;

其他类型:数组,指针,结构,和联合;

printf的缓冲区,当缓冲区(buffer)满,遇到换行字符或需要输入的时候,就可以把缓冲区的内容发送到屏幕,(该行为叫刷新缓冲区),旧式编译器遇到scanf不会刷新缓冲区,可以利用换行符来刷新;

习题:

1、指出下列数据使用合适的数据类型

        人口:int short unsigned short;

        价格:float double

        字母:char

        次数:int unsigned int;

2、什么时候用long 替换 int

        要表示的数超过了int的范围;如果要表示更大的值,那么使用一种在所有系统上都保证至少是32位,提高程序的可移植性;

3、使用那些可移植性的数据类型可以获得32位有符号整数,选择理由?

        要正好获得32位整数,可以使用int32_t 类型。要至少获得32位整数的最小类型可以使用int_least32_t类型;如果要为32位整数提供最快的计算速度,可以选择int_fast32_t类型(假设系统定义了以上类型);

4、指出下列常量的类型及含义

        '\b'  :  char类型(储存为int类型)

        1066  :int

        99.44  :double

        0xAA   :十六进制格式,unsigned int 

        2.0e30   :double

5、常量在声明中使用的数据类型和在printf()中对应的转换说明;

        常量                                   类型                                         转换说明(%转换字符)

        12                                        int                                                %d

        0x3                                      unsigned int                                 %x        %#x(带格式输出)

        'c'                                        char                                               %s    %c(输出一个字符)

        2.34e07                                double                                      %e(指针计数法)%f(十进制)

        '\040'                                 char                                                    %s    %c

        7.0                                       double                                           %f

        6L                                        long                                                %ld

        6.0f                                        float                                                %f

        0x5.b6p12                        float                   %a(指数形式输出一个浮点数,十六进制使用)

6、常量在声明中使用的数据类型和在printf()中对应的转换说明;(加上int为16位)

常量                                                类型                                                   转换说明(%转换字符)

012(数字前面加 0,表示的八进制数)   unsigned int                               %#o                 

2.9e05L                                        long double                                        %Le

's'                                                char                                                        %c        

100000                                       long                                                       %ld                                                              

'\n'                                                char                                                        %c

20.0f                                             float                                                        %f                             

0x44                                            unsigned  int                                            %#x

-40                                               int                                                          %d

7、假设ch是char类型变量。分别使用转义序列,十进制值,八进制字符常量和十六进制字符常量把回车赋给ch(假设使用ascll码)

ch = '\n'

ch = 13

ch = '\015' (十进制的13)

ch = '\xd'      (ascll码中十六进制0d表示回车)

编程练习

1、观察系统如何处理整数上溢,浮点数上溢,浮点数下溢

 

2、提示输入ascll值,打印输入的字符;

 (选项二有缺陷,未调试成功);

3、编写程序,发出一声警报,打印一个文本;

 

4、读取一个浮点数,先打印成小数,再打印指数形式,再打印成p(十六进制)计数法,

 

5、用户输入年龄显示该年龄对应的秒数;

 

6、提示用户输入水的夸脱数,并显示水的质量(1分字水=3.0*10^-23g,1夸脱水 = 950g)

 7、pint,cup,ounce,soup_ladle,teaspoon单位转换

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值