数据和C

1、数据:数据类型关键字

如果是常量数据,编译器一般通过其书写辨认其数据类型,而变量必须预先声明数据类型。

 

整形数据和浮点型数据在应用上的差别在于:

 

2、C数据类型

2.1 short、int、long、long long

如果要用printf打印整形值的八进制和十六进制形式:需要用%o(欧)和%x或%X来代替%d,如果要显示八进制数的前缀0(零)或十六进制的0x或0X,则必须使用%#o、%#x和%#X。

 

C语言默认short类型不长于int类型,long类型不短于int类型。

当使用int型不能表示一个数而使用long可以时,使用long,但是在long类型大于int型系统中,使用long类型会减慢计算,所以如非必要不要用long类型,如果是在long类型等于int类型的系统中时,当确实需要32位整数时,应使用long类型而不是int类型,以便程序移植到16位机器时,仍可正常工作。

 

对于无符号整数,当数值溢出时,用真实值取%取值范围内数的个数即可,但是对于有符号整数,C语言没有具体的规定。

 

 

对于整型常量,C编译器是按照int、 unsigned int、 long、 unsigned long、 long long、 unsigned long long类型解释,也可以使用l(小写L)和L作为后缀,如7L、7LL、7ULL分别就会按照long、long long、unsigned long long类型存储数据。

 

打印时,unsigned int可用%u,打印long,可用%ld、%lx、%lo,打印short,可用%hd、%ho、%hx,打印long long可用%lld和%llu(unsigned long long),格式说明符只用小写字母。使用printf()时,切记每个要显示的值必须对应自己的格式说明符,并且显示类型要与说明符相匹配。

2.2 char

char类型一般为8位,但是使用日本kanji字符集或Unicode字符集之一作为基本字符集的平台上,一个字节应该是16或32位,

而不是8位。

char grade = 'A';必须是单引号对,没有则认为A是变量,如果是"",会被认为是字符串。

有意思的是:C将字符常量视为int类型而不是char类型,如 char grade = 'B';意味着'B'作为数值66存储在一个32位单元中,

而赋值后的grade则把66存储在一个8位单元中,因此可定义一个字符常量'FATE',这将把4个独立的8位ASCII码存储在一个32位单元中,

然而如果把这个字符常量赋给一个char变量,则只有最后8位会起作用,因此变量的值为'E'。


声明不可见字符时,可以用(1)对应的ascii值;(2)转义字符,其中转义字符需要使用''括起来。打印字符是使用%c则打印字符,如果使用%d则打印对应的整数。C90规定可在char前加unsigned和signed,至于一些编译器将char看成是有符号还是无符号数,则需要看编译手册或者limits.h

 

3、_Bool类型

由C99引入,布尔值:true、false。C用值1表示真,0表示false。1位存储空间。

4、可移植类型:inttypes.h

C99引入"确切长度类型",如uint32_t表示32位无符号数,uint32不是关键字,必须在程序中包含inttypes.h头文件。(某些编译器可能还不支持)

使用确切长度类型的潜在问题是:某个系统可能不支持一些选择,因此C99定义了第2组名字集合:这些名字保证表示的类型至少大于指定长度的最小类型,即:"最小长度类型",如int_least8_t是可以容纳8位有符号数的那些类型中长度最小的一个的别名。

C99"最快最小长度类型"定义了一组可使计算达到最快的类型集合,如int_fast8_t定义为系统中对8位有符号数而言计算最快的整数类型的别名。

C99定义系统最大的可能整数类型:intmax_t、uintmax_t,这些数据可能会大于longlong和unsigned long类型。

C99标准还定义了打印这些字符所使用的格式说明符。

5、float、double和long double类型

 

C标准规定,float类型必须至少能表示6位有效数字,取值范围至少位10的(-37~+37)次幂,通常,系统使用32位存储一个浮点数,其中8位表示指数及其符号,24位用于非指数部分及其符号。double具有和float相同的最小取值范围要求,但它必须至少能表示10位有效数字,一般地,double使用64位而不是32位长度,long double类型,可满足比double更高的精度要求,但C只保证long double类型至少同double类型一样精确。

 

 

打印浮点值:%f(double、float)、%e(double、float的指数形式)、%a(C99的16进制形式),相应的long double为%Lf、%Le、%La。print()函数打印传递参数时,C自动将float转为double类型。

 

浮点值的上溢:C语言规定了一个无穷大的值,当发生上溢时,print()打印此值为inf或infinity。

浮点数的下溢:比如具有最小指数,且具有全部可用位表示的最小尾数,当除以2时,通常这个操作会将指数部分减小,但是指数已达到最小值,所以计算机只好将尾数部分的位右移,空出首位二进制位,并丢弃最后一位二进制值,以十进制为例,0.1234E-10除以10,得到0.0123E-10,下溢出并丢失精度。C将丢失精度的浮点数成为低于正常的,并提供检查计算是否会产生低于正常的值的函数。

 

NaN(Not a Number),如asin()输入参数不能大于1,否则函数返回NaN值,print()打印此值为nan、NaN或类似形式。

 

 

 

原数加1后再减去1会得到1,但是使用浮点数却可能会出现浮点数舍入误差:2.0e20,将其加1减去自身后却得到0,是因为2.0e20是2后面跟20个0,但浮点数只能表示6位有效数字,所以计算会得到0.000000值。

6、复数和虚数类型

        C99标准支持这些类型,但有所保留

有3种复数类型:float _Complex、double _Complex、long double _Complex。float _Complex变量包含2个float值,一个代表复数的实部,一个表示复数的虚部,与之对应有3种虚数类型:float _Imaginary、double _Imaginary和long double _Imaginary。如果包含了complex.h头文件,则可用complex代替_Complex,用imaginary代替_Imaginary,用符号I表示-1的平方根。

 

 

 

每一个更大的类型都保证位数不小于当地机器上与之相邻的小的比邻类型位数,可用内置运算符sizeof()查看

7、使用数据类型

当为某个数值类型的变量进行初始化时,如果使用了其他类型的值,C会自动对该值进

行类型转换以便和变量类型匹配,但这意味着可能会丢失一部分数据:

int cost = 12.99; /*cost 实际上为12,直接截尾*/

float pi = 3.1415926536; /*float 6位有效数字,丢失精度*/


 

C通过一种函数原型机制检查函数调用是否使用了正确的数目以及类型的参数,但这对printf()和scanf()函数不起作用,因为它们的参数数目是变化的。另外应当注意:

使用%d显示float值不会把该float值转换为近似的int值,而是显示垃圾值,使用%f显示int值也不会把该int值转换为浮点值,而且参数数目不足和类型不匹配所造成的结果也将随平台不同而不同。

 

 

函数printf()将输出传递给一个被称为缓冲区(buffer)的中介存储区域,缓冲区中的内容再不断被传递给屏幕,标准C规定在缓冲区满的时候、遇到换行符的时候以及需要输入的时候,将缓冲区内容传送到屏幕

 

 

 

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值