一、知识点复习
- 程序离不开数据,C语言提供两大数据类型:整数类型和浮点数类型。
- 最初K&R给出的C语言关键字有int、long、short、unsigned、char、float、double,C90标准增加了signed和void,之后C99标准又添加了_Bool、_Complex、_Imaginary。
1.变量和常量
1.1定义
(1)变量:在程序运行期间可能会改变或被赋值的数据类型。1.2整型常量的写法示例
类型 | 十六进制 | 八进制 | 十进制 |
char | \0x41 | \0101 | |
int | 0x41 | 0101 | 65 |
unsigned int | 0x41u | 0101u | 65u |
long | 0x41L | 0101L | 65L |
unsigned long | 0x41uL | 0101uL | 65uL |
long long | 0x41LL | 0101LL | 65LL |
unsigned long long | 0x41uLL | 0101uLL | 65uLL |
1.3浮点型常量写法示例
类型 | 十进制 |
float | 6.0f |
double | 2.3 |
long double | 4.32L |
2.整数和浮点数
(1)整数:没有小数部分的数。
(2)浮点数:有小数部分。
注意:计算机把浮点数分成小数部分和指数部分且分开进行存储;浮点数可以表示的范围比整数大;一些算术运算里浮点数损失的精度更多;浮点数通常只是实际值的近似值。
3.整数类型
3.1有符号整型
关键字 | 简单定义 | 声明举例 | 在printf()中的对应转换说明 (1.一般默认十进制, 2.只用小写) |
八进制和十六进制的使用 |
int | 可以是正整数、负整数、0; C语言规定int类型不小于16位 |
int m; signed int m;(一般不用特意强调说明,下同) |
%d | 见表1 |
short | 占用的存储空间可能比int少; C语言规定short类型至少占16位 |
short m; short int m; |
%hd | 见表1 |
long | 占用的存储空间可能比int多; C语言规定long类型至少占32位 |
long m; long int m; |
%ld(%Ld) | 见表1 |
long long | 占用的空间可能比long多; long long类型至少占64位 |
long long m; long long int m; |
%lld(%LLd) | 见表1 |
144 | 0144(带前缀) | 64 | 0x64(带前缀)\0X64 | |
int | %o | %#o | %x | %#x、%#X(下略) |
short | %ho | %#ho | %hx | %#hx |
long | %lo | %#lo | %lx | %#lx |
long long | %llo | %#llo | %llx | %#llx |
3.2无符号整型
无符号整型只用于非负值场合,可以表示更大的数。各关键字类型分类与声明与有符号整型类似。在printf()函数中的对应转换说明举例如下表(与有符号整型十进制int类型%d对应使用的是%u,其他进制略):
printf()中对应转换说明 | |
unsigned int | %u |
unsigned short | %hu |
unsigned long | %lu |
unsigned long long | %llu |
3.3字符型
char型
char类型实际上存储的是整数而不是字符,计算机使用ASCII编码处理字符,标准ASCII码的范围是0~127,C语言中char类型占用一个字节。用单引号括起来的单个字符被称为字符常量。char类型的标准声明和定义如下:
char m = 'T';
printf()函数用%c指明待打印的字符。
char类型除了打印字符'T'之外,也有非打印字符。单引号只适用于字符、数字、标点符号,而有些是ASCII字符打印不出来的,所以用一些特殊符号序列表示一些特殊字符,这些特殊符号序列成为转义序列。第二章接触到的换行符\n就属于转义序列。
注意:C语言将字符常量视为int类型而非char类型,char m = 65;这种定义方式也可以但不是一种好的编程风格。
关于char类型有无符号的问题视情况而定,若有符号,可表示的范围是-128~127;若无符号,可表示的范围是0~255;特别的,若只用char处理字符,则无需任何修饰符。
3.4布尔类型
_Bool型
C99标准添加的类型,简而言之就是逻辑值true和false,用1表示true,0表示false。布尔类型属于整数类型,原则上仅占一位储存空间。在有些资料中并不把它算作C中的数据类型。
4.浮点数类型
4.1实浮点类型
(1)float
可精确表示至少6位有效数字,浮点型常量后面跟f。
(2)double
能表示比float类型更多的有效数字(至少10位)和更大的指数。
(3)long double
能表示比double更多的有效数字和更大的指数,浮点型常量后跟L。
十进制 | 指数记数法 | 十六进制 | |
float | %f | %e | %a |
double | %f | %e | %a |
long double | %Lf | %Le | %La |
4.2复数和虚数浮点数
虚数类型是可选类型。复数的实部和虚部类型都基于实浮点类型构成:
(1)复数
float_Complex
double_Complex
long double_Complex
(2)虚数
float_Imaginary
double_Imaginary
long double_Imaginary
二、编程练习
1.
/*overflow.c--整数上溢、浮点数上溢、浮点数下溢
author:Alice_12
date:2018.2.18*/
#include<stdio.h>
int main(void)
{
int i = 2147483647;//32位的long最小取值范围的正上限是2147483647
unsigned int j = 4294967295;//unsigned long的最小取值范围上限
float m = 3.4e38f;//上溢
float n = 0.1234e-10f;//下溢
/*当前系统指定的各数据类型大小(字节数)*/
printf("Type int has a size of %d bytes.\n",sizeof(int));//sizeof是C内置运算符,以字节为单位给出指定类型的大小
printf("Type short has a size of %d bytes.\n",sizeof(short));
printf("Type long has a size of %d bytes.\n",sizeof(long));
printf("Type char has a size of %d bytes.\n",sizeof(char));
printf("Type float has a size of %d bytes.\n",sizeof(float));
printf("Type double has a size of %d bytes.\n\n",sizeof(double));
printf("给出以下数据:\n");
printf("有符号整型i=%d\n", i);
printf("无符号整型j=%u\n", j);
printf("浮点数m=%e\n", m);
printf("浮点数n=%e\n\n", n);
/*整数上溢*/
printf("i+1=%d i+2=%d\n", i+1, i+2);
printf("j+1=%u j+2=%u\n", j+1, j+2);
/*浮点数上溢*/
printf("m*100.0=%e or %f\n", m*100.0);
/*浮点数下溢*/
printf("n/10=%e or %f\n", n/10);
return 0;
}
2.
/*character.c--输入一个ASCII值,打印输入的字符
author:Alice_12
date:2018.2.18*/
#include<stdio.h>
int main(void)
{
int i;
printf("Please enter a number between 0~127:");
printf("___\b\b\b");
scanf("%d", &i);
printf("\n%d in ASCII is %c\n", i, i);
return 0;
}
3.
/*alarm.c--警报声响后打印一段文本
author:Alice_12
date:2018.2.18*/
#include<stdio.h>
int main(void)
{
printf("\aStartled by the sudden sound, Sally shouted,\n");//转义序列\a表示警报
printf("\"By the Great Pumpkin, what was that!\"\n");
return 0;
}
4.
/*display.c--读取一个浮点数并分别以小数点形式、指数形式、十六进制记数法(若可以)打印显示
author:Alice_12
date:2018.2.18*/
#include<stdio.h>
int main(void)
{
float i;
printf("Please enter a floating number:");
printf("_____\b\b\b\b\b");
scanf("%f", &i);
printf("\nfixed-point notation: %f\n", i);//形参里的第一个\n经测试就算不要也能实现换行,猜测应当是缓冲区满了,保留此问题,待议
printf("exponential notation: %e\n", i);
printf("p notation: %a\n", i);
return 0;
}
5.
/*secong.c--输入年龄,显示对应的秒数
author:Alice_12
date:2018.2.18*/
#include<stdio.h>
int main(void)
{
int i;
printf("It's about 3.156e7 second a year.\n");
printf("Do you wanna know what your age is in seconds?\n");
printf("All right, let's do it!\n");
printf("Please enter your age: ");
printf("__\b\b");
scanf("%d", &i);
printf("\nWow! your age in seconds is %e!\n", i*3.156e7);//换行问题同第四题
return 0;
}
6.
/*water.c--输入水的夸脱数,显示水分子数量
author:Alice_12
date:2018.2.18*/
#include<stdio.h>
int main(void)
{
double i = 3.0e-23;//1个水分子的质量
float j = 950;//1夸脱水的质量
float m;//水的夸脱数
double n;//水分子的数量
printf("The mass of a water molecule is 3.0e-23 gram.\n");
printf("The mass of a quart of water is 950 gram.\n");
printf("Enter the number of quart of water: ");
printf("__\b\b");
scanf("%f", &m);
n = m * j / i;
printf("The number of water molecule is %e\n", n);
return 0;
}
7.
/*inch.c--以英寸为单位输入身高,以厘米为单位打印
author:Alice_12
date:2018.2.18*/
#include<stdio.h>
int main(void)
{
float inch;
float i = 2.54f;//1英寸有2.54厘米
float cm;
printf("Enter your height(in inch):");
printf("_____\b\b\b\b\b");
scanf("%f", &inch);
cm = inch * i;
printf("your height in cm is %f\n", cm);
return 0;
}
8.
/*number.c--输入杯数,分别显示其他单位的等价容量
author:Alice_12
date:2018.2.18*/
#include<stdio.h>
int main(void)
{
float j;//杯
printf("Enter Cup number:");
printf("___\b\b\b");
scanf("%f", &j);
//品脱
printf("%f glass of water is %e pint.\n", j, 0.5*j);
//盎司
printf("%f glass of water is %e ounce.\n", j, j*8);
//汤勺
printf("%f glass of water is %e soup spoon.\n", j, j*8*2);
//茶勺
printf("%f glass of water is %e tea spoon.\n", j, j*8*2*3);
return 0;
}
三、总结
1.编程中的部分数据问题需要了解一下二进制、十进制、八进制、十六进制之间的相互转换。
2.printf()在本章的使用仍然是重点,体现在相关数据类型的打印转换。
3.关于float和double如何选取:有一个说法是float以一个字32位显示,7个有效位,double以2个字64位显示,16个有效位;浮点数字面值在不做f和l后缀时都默认为double类型;进行浮点数运算时float类型损失的精度比double多。
4.在练习4往后我遇到了换行不确定的问题,原因在于书上例3.10的程序分析及刷新输出中提到当缓冲区满、遇到换行符、需要输入时会把printf发送到缓冲区中的输出发送到屏幕上,我的实际练习情况有点不符。
5.在我使用的编译器上并不支持long long类型,所以没有做相关练习。