小结
C 有多种的数据类型。基本数据类型分为两大类:整数类型和浮点数类型。通过为类型分配的储存量以及是有符号还是无符号,区分不同的整数类型。最小的整数类型是char,因实现不同,可以是有符号的char或无符号的char,即unsigned char或signed char。但是,通常用char类型表示小整数时才这样显示说明。其他整数类型有short、int(C规定int的取值范围最小为-32768~32767。16位unsigned int允许的取值范围是0~65535,而不是-32768~32767)、long和long long类型。C规定,后面的类型不能小于前面的类型。上述都是有符号类型,但也可以使用unsigned关键字创建相应的无符号类型:unsigned short、unsigned int、unsigned long和unsigned long long。或者,在类型名前加上signed修饰符显式表明该类型是有符号类型。最后,Bool类型是一种无符号类型,可储存0或1,分别代表false和true。
位、字节和字是描述计算机数据单元或存储单元的术语。最小的存储单元是位(bit),可以储存0或1(或者说,位用于设置“开”或“关”)。虽然1位储存的信息有限,但是计算机中位的数量十分庞
大。位是计算机内存的基本构建块。字节(byte)是常用的计算机存储单位。对于几乎所有的机器,1字节均为8位。这是字节的标准定义,至少在衡量存储单位时是这样(但是,C语言对此有不同的定义)。既然1位可以表示0或1,那么8位字节就有256(2的8次方)种可能的0、1的组合。通过二进制编码(仅用0和1便可表示数字),便可表示0~255的整数或一组字符。字(word)是设计计算机时给定的自然存储单位。对于8位的微型计算机(如,最初的苹果机), 1个字长只有8位。从那以后,个人计算机字长增至16位、32位,直到目前的64位。计算机的字长越大,其数据转移越快,允许的内存访问也更多。
整数可以表示为十进制、八进制或十六进制。0前缀表示八进制数,0x或0X前缀表示十六进制数。例如,32、040、0x20分别以十进制、八进制、十六进制表示同一个值。l或L前缀表明该值是long类型, ll或LL前缀表明该值是long long类型。
计算机中的浮点数和整数在本质上不同,其存储方式和运算过程有很大区别。即使两个32位存储单元储存的位组合完全相同,但是一个解释为float类型,另一个解释为long类型,这两个相同的位组合表示的值也完全不同。例如,在PC中,假设一个位组合表示float类型的数256.0,如果将其解释为long类型,得到的值是113246208。C语言允许编写混合数据类型的表达式,但是会进行自动类型转换,以便在实际运算时统一使用一种类型。
浮点类型有3种:float、double和C90新增的long double。后面的类型应大于或等于前面的类型。有些实现可选择支持复数类型和虚数类型,通过关键字Complex和Imaginary与浮点类型的关键字组合(如,double Complex类型和float Imaginary类型)来表示这些类型。
浮点数可写成固定小数点的形式(如,9393.912)或指数形式(如,7.38E10)。C99和C11提供了第3种指数表示法,即用十六进制数和2的幂来表示(如,0xa.1fp10)。
在C语言中,直接表示一个字符常量的方法是:把该字符用单引号括起来,如'Q'、'8'和'$'。C语言的转义序列(如,'\n')表示某些非打印字符。另外,还可以在八进制或十六进制数前加上一个反斜杠(如,'\007'),表示ASCII码中的一个字符。
printf()函数根据转换说明打印各种类型的值。转换说明最简单的形式由一个百分号(%)和一个转换字符组成,如%d或%f。
最后,看有哪些C语言的数据类型关键字
复习题
1.指出下面各种数据使用的合适数据类型(有些可使用多种数据类型):
a.East Simpleton的人口
b.DVD影碟的价格
c.本章出现次数最多的字母
d.本章出现次数最多的字母次数
a.int 类型,也可以是 short 类型或unsigned short 类型。人口数是一个整数。
b.float 类型,价格通常不是一个整数(也可以使用 double 类型,但实际上不需要那么高的精度)。
c. char 类型。
d. int 类型,也可以是 unsigned 类型。
2.在什么情况下要用long类型的变量代替int类型的变量?
原因之一:在系统中要表示的数超过了 int 可表示的范围,这时要使用 long 类型。
原因之二:如果要处理更大的值,那么使用一种在所有系统上都保证至少是32位的类型,可提高程序的可移植性。
3.使用哪些可移植的数据类型可以获得32位有符号整数?选择的理由是什么?
如果要正好获得 32位的整数,可以使用int32_t类型。要获得可存储至少 32 位整数的最小类型,可以使用 int_least32_t类型。如果要为 32位整数提供最快的计算速度,可以选择int_fast32_t类型(假设你的系统已定义了上述类型)。
4.指出下列常量的类型和含义(如果有的话):
a.'\b'
b.1066
c.99.44
d.0XAA
e.2.0e30
a.char类型常量(但是存储为int类型)
b.int类型常量
c.double类型常量
d.unsigned int类型常量,十六进制格式
e.double类型常量
5.Dottie Cawm编写了一个程序,请找出程序中的错误。
include <stdio.h>
main
(
float g; h;
float tax, rate;
g = e21;
tax = rate*g;
)
第1行:应该是#include<stdio.h>
第2行:应该是int main(void)
第3行:把(改为{
第4行:g和h之间的;改成,
第5行:没问题
第6行:虽然这数字比较大,但在e前面应至少有一个数字,如1e21或1.0e21都可以。
第7行:没问题,至少没有语法问题。
第8行:把)改成}
除此之外,还缺少一些内容。首先,没有给rate变量赋值;其次未使用h变量:而且程序不会报告计算结果。虽然这些错误不会影响程序的运行(编译器可能给出变量未被使用的警告),但是它们确实与程序设计的初衷不符合。另外,在该程序的末尾应该有一个return语句。
#include <stdio.h>
int main(void)
{
float g,h;
float tax,rate;
rate = 0.08:
g = 1.0e5;
tax = rate*q;
h = g + tax;
printf("You owe $f plus $f in taxes for a total of $f.\n",g, tax, h);
return 0;
}
6.写出下列常量在声明中使用的数据类型和在printf()中对应的转换说明:
7.写出下列常量在声明中使用的数据类型和在printf()中对应的转换说明(假设int为16位):
8.假设程序的开头有下列声明:
int imate = 2;
long shot = 53456;
char grade = 'A';
float log = 2.71828;
把下面printf()语句中的转换字符补充完整:
printf("The odds against the %__ were %__ to 1.\n",imate, shot);
printf("A score of %__ is not an %__ grade.\n", log,grade);
printf("The odds against the %d were %ld to 1.\n",imate, shot);
printf("A score of %f is not an %c grade.\n", log, grade);
9.假设ch是char类型的变量。分别使用转义序列、十进制值、八进制字符常量和十六进制字符常量把回车字符赋给ch(假设使用ASCII编码值)。
ch = '\r';
ch = 13;
ch = '\015';
ch = '\xd';
10.修正下面的程序(在C中,/表示除以)。
void main(int) / this program is perfect /
{
cows, legs integer;
printf("How many cow legs did you count?\n);
scanf("%c", legs);
cows = legs / 4;
printf("That implies there are %f cows.\n", cows)
}
#include <stdio.h>
void main(int) /* this program is perfect */
{
int cows, legs;
printf("How many cow legs did you count?\n);
scanf("%d", &legs);
cows = legs / 4;
printf("That implies there are %d cows.\n", cows);
return 0;
}
11.指出下列转义序列的含义:
a.\n
b.\\
c.\"
d.\t
a.换行字符
b.反斜杠字符
c.双引号字符
d.制表字符
编程练习
2.编写一个程序,要求提示输入一个ASCII码值(如,66),然后打印输入的字符。
#include <stdio.h>
int main(void)
{
int ascii;
printf("Enter an ASCII code: ");
scanf("%d", &ascii);
printf("%d is the ASCII code for %c.\n", ascii, ascii);
return 0;
}
4.编写一个程序,读取一个浮点数,先打印成小数点形式,再打印成指数形式。然后,如果系统支持,再打印成p记数法(即十六进制记数法)。按以下格式输出(实际显示的指数位数因系统而异):
Enter a floating-point value: 64.25
fixed-point notation: 64.250000
exponential notation: 6.425000e+01
p notation: 0x1.01p+6
#include <stdio.h>
int main(void)
{
float num;
printf("Enter a floating-point value: ");
scanf("%f", &num);
printf("fixed-point notation: %f\n", num);
printf("exponential notation: %e\n", num);
printf("p notation: %a\n", num);
return 0;
}
6.1个水分子的质量约为3.0×10 −23 克。1夸脱水大约是950克。编写一个程序,提示用户输入水的夸脱数,并显示水分子的数量。
#include <stdio.h>
int main(void)
{
float mass_mol = 3.0e-23; /* mass of water molecule in grams */
float mass_qt = 950; /* mass of quart of water in grams */
float quarts;
float molecules;
printf("Enter the number of quarts of water: ");
scanf("%f", &quarts);
molecules = quarts * mass_qt / mass_mol;
printf("%f quarts of water contain %e molecules.\n", quarts, molecules);
return 0;
}