数据和C
本文介绍以下内容
1关键字
2运算符
3函数
4整数类型和浮点数类型
5如何使用printf()和scanf()函数读写不同的类型
程序离不开数据,把数字,字母,文字输入计算机,就是希望它利用这些数据完成某些任务。
c语言提供两大数据:整数类型和浮点数类型
1 示例程序
/*platinum.c --your weight in platinum */
#include <stdio.h>
int main (void)
{
float weight; //你的体重
float value; //相等重量的白金价值
printf("Are you worth your weight in platinum?\n");
printf("Let's check it out.\n");
printf("please enter your weight in pounds:");
//获取用户的输入
scanf("%f",&weight);
//假设白金的价格$1700
//14.5833用于英镑转化
value =1700.0 * weight *14.5833;
printf("your weight in platinum is worth $%.2f.\n",value);
printf("you are easily worth that! if platinum prices drop,\n");
printf("eat more to maintain your value.\n");
return 0;
}
注:“enter your weight ”的意思是输入你的体重,然后按下Enter或Return键(不要输入之后就一直等着)
程序结果
Are you worth your weight in platinum?
Let's check it out.
please enter your weight in pounds:156
your weight in platinum is worth $3867491.25.
you are easily worth that! if platinum prices drop,
eat more to maintain your value.
1.1 程序调整
本例 需要调用两次getcher()函数
/*platinum.c --your weight in platinum */
#include <stdio.h>
int main (void)
{
float weight; //你的体重
float value; //相等重量的白金价值
printf("Are you worth your weight in platinum?\n");
printf("Let's check it out.\n");
printf("please enter your weight in pounds:");
//获取用户的输入
scanf("%f",&weight);
getchar();
getchar();
//假设白金的价格$1700
//14.5833用于英镑转化
value =1700.0 * weight *14.5833;
printf("your weight in platinum is worth $%.2f.\n",value);
printf("you are easily worth that! if platinum prices drop,\n");
printf("eat more to maintain your value.\n");
return 0;
}
键入156并按下Enter(或Return)键(发送一个换行符),然后是scanf()读取键入的数字,第一个getchar()读取换行符,第2个getchar()让程序暂停,等待输入。
1.2 程序中的新元素
1 代码中用到了一种新的变量 float
2演示了常量的几种新写法,可以使用带小数点的数
3在printf()中使用%f来处理浮点值。%.2f中的.2用于精准控制输出,指定输出的浮点数只显示小数点后面两位
4scanf()函数用于输入。%f说明scanf()要读取用户从键盘输入的浮点数
5新特点是人机交互性
2 变量与常量数据
常量:有些数据类型在程序使用之前已经预定好了,在整个程序的运行变化中没有变化
变量:其他数据类型在程序运行期间可能会改变或被覆值
3数据:数据类型关键字
int表示基本整数类型
char关键字用于指定字母和其他字符,也可以表示较小的整数
float double long double表示带小数点的数
_Bool类型表示布尔值(true false)
_Complex和 _Imaginary分别表示复数和虚数
位、字节和字
位、字节和字是描述计算数据单元或储存单元的术语。这里主要指储存单元
位是计算机内存的基本构建块,最小的储存单位是位(bit)可以储存0或1
字节时常用的计算机储存单位,对于几乎所有的机器,1字节均为8位
字是设计计算机时给定的自然储存单位
2.1 整数和浮点数
整数没有小数部分,浮点数有小数部分
浮点数表达范围比整数大
一些算术运算,浮点数损失的精度更多
计算机的浮点数不能表示区间内的所有值,只能是实际数的的近似值
浮点数运算会比整数运算慢一些
3 C语言基本数据类型
3.1 int类型
int类型是有符号整数型,范围:-32768~32767
声明int变量可以通过赋值和函数来获得,也可以初始化变量
可以使用printf()函数打印int类型的值
注意:转义说明的数量与打印数量相等
3.11 显示八进制和十六进制
以十进制显示数字,使用%d;以八进制显示数字,使用%o;以十六进制显示数字,使用%x。要显示各进制数的前缀0,0x和0X,必须使用%#o,%#x
,%#X
//以十进制、八进制、十六进制打印十进制数100
#include <stdio.h>
int main (void)
{
int x =100;
printf("dec=%d; octal=%o; hex=%x\n", x, x, x);
printf("dec=%d; octal=%#o; hex=%#x\n", x, x, x);
return 0;
}
3.2 其他整数类型
short类型占用的储存空间可能比int类型少,常用于较小数值的场合以节省空间
long占用的储存空间可能比int多适用于较大数值的场合
long long占用的储存空间可能比long多适用于更大的数值场合
unsigned int 或unsigned 只用于非负值的场合。这种类型与有符号类型表示的范围不同
3.2.1 long常量和long long常量
通常程序代码中使用的数字都被储存为int类型,八进制和十六进制常量被视为int类型,可以在值的末尾加上l(小写)或L后缀,使用L后缀更好
类似地,在支持long long 类型的系统中,也可以使用ll或LL后缀来表示long long类型的值
整数溢出
// toobig.c--超出系统允许的最大int值
#include <stdio.h>
int main (void)
{
int i= 2147483647;
unsigned int j = 4294967295;
printf ("%d %d %d\n",i,i+1,i+2);
printf ("%u %u %u\n",j,j+1,j+2);
return 0;
}
输出结果
2147483647 -2147483648 -2147483647
4294967295 0 1
溢出行为是未定义行为,c标准并未定义有符号类型的溢出规则(上例是特殊情况,也可能会出现其他情况)
3.2.2 打印类型
打印unsigned int类型的值,使用%u转换说明;打印long类型的值使用%ld转换说明,如果系统中int和long的大小相同,使用%d就行(但是,这样的程序移植到其他程序时会无法正常工作)
在x和o前面可以使用l前缀,%lx表示以十六进制格式打印long类型整数,%lo表示八进制格式打印long类型整数
打印short类型,可以使用h前缀,%hd表示十进制显示short类型的整数,%ho表示以八进制显示short类型的整数
注:虽然c允许使用大写或小写的常量后缀,但是在转换说明中只能写小写
//printf.c--更多printf()的特性
#include<stdio.h>
int main (void)
{
unsigned int un =3000000000; //int为32位和shaort为16位的系统
short end=200;
long big =65537;
long long verybig = 12345678908642;
printf("un = %u and not %d\n",un,un);
printf("end = %hd and %d\n",end ,end );
printf ("big =%ld and not %hd\n",big ,big);
printf("verybig =%lld and not %ld\n",verybig,verybig);
return 0;
}
执行结果:
un = 3000000000 and not -1294967296
end = 200 and 200
big =65537 and not 1
verybig =12345678908642 and not 1942899938
为什么要进行转换?
int类型被认为是计算机处理整数类型时最高效的类型
h修饰符有什么用?
使用h修饰符可以显示较大整数被截断成short类型值的情况
本例中:
65537 以二进制写成了32位,使用%hd,printf()只会查看16位
verybig由于使用%ld,printf()只显示了储存在后32位值
注:在使用printf()函数时,切记检查每个待打印值都相应的转换说明,还要检查转换说明的类型是否与待打印值的类型相匹配
3.3 使用字符:char类型
char类型用于储存字符(字母和标点符号),但从技术层面来看,char是从技术层面
3.3.1 声明char类型变量
char类型变量的声明方式与其他类型变量的声明方式相同
3.3.2 字符常量初始化
标准ASCII表的范围是0~127
用单引号括起来的单个字符被称为字符常量。编译器一经发现'A'就会将其发现。
例如:char grade = 'A';
char grade = '65'; //对于ASCII,这样没问题,但是一种不好的编程风格(最好使用字符常量,而不是数字来代替)
3.3.3 非打印字符
单引号只适用于字符、数字、标点符号,浏览ASCII发现,有些字符打印不出,这就需要表义转义
转义序列:
\a--警报;\b--退格;\f--换页;\n--换行;\r--回车;\t--水平制表符;\v--垂直制表符
\--反斜杠;\'--单引号;"--双引号;?--问号?\0oo--八进制;\xhh--十六进制
3.3.4 打印字符
printf()函数用%c指明待打印字符
有些编译器把char实现为有符号类型,这意味着char可表示的范围是-128~127.而有些编译器把char实现为无符号类型,其范围0~255
在char前面使用signed或unsigned,来定义类型
signed char 表示有符号类型
unsigned char 表示无符号类型
3.4 _Bool类型
_Bool类型表示布尔值,即逻辑值true和false
3.5 可以移值类型
stdint.h和inttypes.h(如有需要自行了解)
3.6 float、double、long double类型
3.6.1 声明浮点型常量
浮点型变量的声明和初始化方式与整型变量相同
3.6.2 浮点型常量
浮点型常量的基本形式是:有符号的数字(包括小数点),后面紧跟e或E,最后是一个有符号表示10的指数
例如:
-1.56E+12;2.87e-3
默认情况下,编译器假定浮点型常量是double类型的精度,在浮点数后面加上f或F后缀可覆盖默认设置,编译器会将浮点型常量看做float类型,使用l或L后缀使得数字成为long double类型(建议使用L后缀),没有后缀的浮点型常量是double类型
3.6.3 打印浮点值
printf()函数使用%f转换说明打印十进制记数法的float和double类型浮点数,用%e打印指数记数法的浮点数,打印long double类型要使用%Lf、%Le或%La类型转换说明,没定义参数类型的函数的值自动转换成double类型。
3.6.4 浮点值的上溢下溢
当计算导致数字过大时,超出当前表达类型就会上溢(printf()函数会打印inf或infinity)
float toobig =3.4E38*100.0f;
printf("%e\n",toobig);
由于对很小的数做除法,在计算过程中损失了原末尾有效位的数字,这种情况叫做下溢
特殊的浮点值NaN(printf()会返回NaN或者nan)
3.7 复数、虚数类型
float_Complex;double_Complex;long doubhle_Complex
float_Imaginary;double_Imaginary;long double_Imaginary
如果包含complex.h头文件,便可使用complex来代替_Complex;用imaginary来代替 _Imaginary,还可以用I代替-1的平方根(也可以不使用)
3.8 类型大小
打印类型的大小
//typesize.c--打印类型大小
#include<stdio.h>
int main (void)
{
//c99为类型大小提供%zd转换说明
printf("Type int has a size of %zd bytes.\n",sizeof(int));
printf("Type char has a size of %zd bytes.\n",sizeof(char));
printf("Type long has a size of %zd bytes.\n",sizeof(long));
printf("Type long long has a size of %zd bytes.\n",sizeof(long long));
printf("Type double has a size of %zd bytes.\n",sizeof(double));
printf("Type long double has a size of %zd bytes.\n",sizeof(long double));
return 0;
}
Type int has a size of 4 bytes.
Type char has a size of 1 bytes.
Type long has a size of 4 bytes.
Type long long has a size of 8 bytes.
Type double has a size of 8 bytes.
Type long double has a size of 16 bytes.
4 小结
4.1 关键字
基本数据类型由11个关键字组成:
int;long;short;unsigned;char;float;double;signed;_Bool; _Complex; _Imaginary
4.2 整型分为有符号整型和无符号整型
有符号整型可用于表示正整数和负整数
无符号整型只能用于表示零和正整数,因此无符号整型可表示的正整数比有符号整型的大,在整型类型前加上关键字unsigned表明该类型是无符号整型
4.3 字符类型
4.4 布尔类型
4.5 浮点数类型
浮点数类型又分为实浮点数类型和虚浮点数类型