C Primer Plus 第三章——数据和C

/*rhodium.c——用金属铑衡量您的体重
#include<stdio.h>
int main(void)
{
float weight;
float value;
printf("Are you worth your weight in rhodium?\n"):
printf("Let's check it out.\n");
printf("Please enter your weight in pounds:");
scanf("%f",&weight):
value=770*weight*14.5833;
printf("Your weight in rhodium is worth $%.2f.\n", value);
printf("You are easily worth that! If rhodium price drop,\n");
printf("eat more to maintain your value.\n");
return 0;
}


数据类型:

整数  整数就是没有小数部分的数。C中,小数点永远不会出现在整数中。整数以二进制数字存储。

浮点数  浮点数差不多可以和数学中的实数概念相对应。浮点数表示法将一个数分为小数部分和指数部分并分别存储。因此7.00和7有相同的值,但他们的存储方式不同。

整数:

C的各种整数类型的区别在于所提供的数值的范围,以及数值是否可以取负值。int类型是基本选择。

int 类型是有符号整数。一般地int类型存储在计算机的一个字中(不同计算机有不同的字长,如16位,32位,64位等)。ANSI C规定int 类型的最小范围是-32768~32767。 C把大多数整数常量看作int类型。如果整数特别大,则有不同的处理。

在C中,由专门的前缀指明使用哪一种进制。前缀0x或者0X表示使用十六进制值,如16用十六进制表示为0x10或0X10。与之类似,前缀0(零)表示使用八进制。例如,十进制数16用八进制表示为020。使用不同进制并不影响数字的存储。

要在输出中显示八进制和十六进制数字,可以用%0和%x代替%d。如果想显示C语言前缀,可以使用格式说明符%#o,%#x和%#X分别生成0,0x和0X前缀。

其他整数类型:

short int (short)类型:可能占用比int类型更少的存储空间,用于仅需小数值的场合以节省空间。是一种有符号类型。

long int (long)类型:可能占用比int类型更多的存储空间,用于使用大数值的场合。是一种有符号类型。

long long int (long long)类型:C99标准中引入,可能占用比long类型更多的存储空间,用于使用更大数值的场合。是一种有符号类型。

unsigned int (unsigned)类型:用于只使用非负值的场合。这种类型同有符号类型的表示范围不同。例如,16位的unsigned int 取值范围位0到65535,而带符号的int取值范围为-32768到32767。由于指示数值正负的位也被用于二进制位,所以无符号数可以表示更大的数值。

C90标准中还允许unsigned long int 和unsigned short int类型。C99中又增加了unsigned long long int类型。

整数溢出:如果整数太大,超过了整数类型的范围时,它将会溢出到起始点。unsigned的起始点是0,int的起始点是一个负值。

根据整数常量的大小,编译器会依次将其视为int,long,unsigned long等类型。如果希望把一个较小的常量作为long类型对待,可以使用l或L后缀。类似的后缀有ll或LL(long long),u或U(unsigned),如020L(八进制),7L,5ull,9LLU。

打印unsigned int类型数字可以使用%u符号。打印long数值可以使用%ld格式说明符。在x和o符号钱也可以使用l前缀,如%lx表示以十六进制格式打印长整数。对short类型可以使用h前缀,如%hd表示以十进制显示short整数,%ho表示以八进制显示short整数。h和l前缀可以和u结合使用以表示无符号类型,如%lu表示unsigned long类型。使用printf()函数时,切记每个要显示的值都必须对应自己的格式说明符,并且显示值的类型要同说明符相匹配。

char类型用于存储字母和标点符号之类的字符。但是技术实现上char却是整数类型,这是因为char类型实际存储的是整数而不是字符。为了处理字符,计算机使用一种数字编码,用特定的整数表示特定的字符。最常用的是ASCII码。标准ASCII码的范围从0到127,只需7位即可表示。

C把一个字节(byte)定义为char类型使用的位(bit)数(通常为8)。C将字符常量视为int类型而非char类型。例如,

char grade='B';
意味着‘B’作为数值66存储在一个32位单元中,而赋值后的grade则把66存储在一个8位单元中。

使用%c说明符打印一个字符。

_Bool类型由C99引入,用于表示布尔值,即逻辑值true与false。因为C用值1表示true,用值0表示false,所以_Bool类型实际上也是一种整数类型,只是原则上它仅仅需要1位来进行存储。

头文件inttypes.h使用typedef工具创建了新的整数类型名字。

浮点数:

浮点数类似于科学计数法,能够表示小数在内的更大范围的数。

C标准规定,float类型必须至少能表示6位有效数字,取值范围至少为10^(-37)到10^(+37)。通常,系统使用32位存储一个浮点数。其中8位用于表示指数及其符号,24位用于表示非指数的部分(称为尾数或有效数字)及其符号。

C还提供一种成为double(意为双精度)的浮点类型。double类型必须至少能表示10位有效数字。一般地,double使用64位长度。C提供了第三种浮点类型long double类型,以满足比double类型更高的精度需求。

书写浮点常量:一个浮点常量最基本的形式是:包含小数点的一个带符号的数字序列,接着是字母e或E,然后是代表10的指数的一个有符号值。如-1.56E+12,2.87e-3。可以没有小数点或指数部分,但不能同时没有二者。

默认情况下,编译器将浮点常量当作double类型。可以通过f或F后缀使编译器将浮点常量当作float类型,如2.3f和9.11E9F。l或L后缀是一个数字成为long double类型,如54.3l和4.32e4L。没有后缀的浮点常量为double类型。

printf()函数使用%f格式说明符打印十进制记数法的float和double数字。用%e打印指数计数法的数字。用%a打印C99支持的十六进制格式浮点数。打印long double类型需要用%Lf和%Le,%La。

浮点值的上溢:当计算结果是一个大得不能表达的数时,会发生上溢。对这种情况的反应原来没有规定,但是现在的C语言要求赋一个代表无穷大的特殊值,显示为inf或infinity。下溢:损失精度,直至所有的位都为0。另外还有一个特殊的浮点值NaN(Not -a-Number)。例如asin()函数返回反正弦值,但是正弦值不能大于1,所以asin()函数的输入参数不能大于1,否则函数返回NaN值。

复数类型:有三种,分别是float_Complex, double_Complex和long double_Complex。float_Complex包含两个float值,一个表示复数的实部,另一个表示复数的虚部。与之类似,有三种虚数类型,分别是float_Imaginary, double_Imaginary和long double_Imaginary。包含complex.h头文件可以用complex代替_Complex,用imaginary代替_Imaginary,用符号I(大写i)表示-1的平方根。

C没有字符串类型,但它仍能很好的处理字符串。


C的内置运算符sizeof()以字节为单位给出类型的大小。C99为sizeof的返回值提供了%zd说明符。以char类型为1字节。

当为某个数据类型的变量进行初始化时,如果使用了其他类型的值,C会自动对该值进行类型转换以便和变量类型相匹配,这意味着可能丢失一部分数据。例如:

int cost=12.99; //把一个int变量初始化为一个double值
float pi=3.1415926536; //把一个float变量初始化为一个double值
第一个声明将12赋给cost。将浮点值转换为整数时,C简单的丢弃小数部分(截尾),而不进行四舍五入。第二个声明将会损失部分精度,因为float类型只能保证前六位是精确的。

使用%d打印float值并不会把该float值转换为近似的int值,而是显示垃圾值。类似的,使用%f显示int值也不会把该int值转换为浮点值。

printf()语句将输出传递给一个被称为缓冲区(buffer)的中介存储区域。标准C规定在以下几种情况下将缓冲区内容传给屏幕:缓冲区满的时候,遇到换行符的时候以及需要输入的时候。

*******************************************************************

//  花了好长时间终于整理完第三章……过程可以说十分纠结。Basically 只是把书上第一次看的时候划线的部分挑一些又手打了一遍……导致心情很复杂,感觉没有打一遍的必要,又感觉有必要,毕竟有的内容不看就忘了。内容太过于琐碎也要整理出来……这样效率也不高,好像也违背了整理笔记这件事的初衷,本应该是梳理知识点,以及对理解不深的内容粘在上面,而不是一味地罗列琐碎的细节。整理下一章的时候注意吧。。。





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值