【C-Primer-Plus读书笔记】第3章:数据和C
变量与常量
- 常量:有些数据类型在程序使用之前已经预先设定好了,在整个程序的运行过程中没有变化,这些称为常量。
- 变量:其他数据类型在程序运行期间可能会改变或被赋值,这些称为变量
数据:数据类型关键字
最初K&R标准 | C90标准 | C99标准 |
---|---|---|
int | signed | _Bool |
long | void | _Complex |
short | _Imaginary | |
unsigned | ||
char | ||
float | ||
double |
- 按计算机的存储方式,可分为两大基本类型:整数类型和浮点数类型。
- 整数和浮点数:计算机以二进制数字存储整数;而把浮点数分成小数部分和指数部分来表示,并分开存储这两部分。
- 位、字节和字:位是计算机的最小存储单位,可以存储0或1,即二进制数字,或者说位用于设置“开”或“关”;字节是是能表示一个完整数据的基本单位,1字节均为8位;字是设计计算机时给定的自然存储单位,即常说的字长,比如目前的64位字长计算机,计算机的字长越大,其数据转移越快,允许的内存访问页更多。
基本数据类型
int类型
- 声明
int erns;
int hogs,cows;
- 初始化
erns = 21;
int ogs = 22,cows=23;
- int类型常量
上面出现的整数(21,22,23)都是整型常量和整型字面量。 - 打印
可以使用printf()函数打印int类型的值,使用【%d】(十进制整数)转换说明。 - 八进制和十六进制
使用:在C语言中用特定的前缀表示使用哪种进制。0x或0X前缀表示十六进制,0前缀表示八进制。 - 显示八进制和十六进制:使用printf()函数,以8进制显示使用【%0】转换说明,以十六进制使用【%x】转换说明。另外要显示各进制数的前缀0、0x和0X,必须分别使用【%#0】、【%#x】、【%#X】。
其他整型常量
C语言提供3个附属关键字修饰基本整数类型:short、long和unsigned,注意以下几点:
- short int类型(或者简写为short)占用的存储空间【可能】比int类型少
- long int或long占用的存储空间【可能】比int多
- long long int或long long占用的存储空间【可能】比long多
- unsigned int或unsigned只用于非负值场合。
- 在任何有符号类型前面添加关键字signed,可强调使用有符号类型的意图。
- 声明
long int estime;
long johns;
short int erns;
short ribs;
unsigned int s_count;
unsigned players;
unsigned long headcount;
unsigned short yesvotes;
long long ago;
使用多种数据类型的原因
- C语言只规定了short占用的存储空间不能多于int,long占用的存储空间不能少于int,这样规定是为了适应不同机器。
- C标准对基本数据类型只规定了允许的最小大小。
- int类型的选择:首先,考虑unsigned类型。这种类型常用于计数,因为计数不用负数,而且unsigned可以表示更大的正数。
当一个数超出了int类型的取值范围且在long类型取值范围内时,就使用long类型。对于那些long占用空间比int大的系统,使用long会减慢运算速度。因此,如非必要不要使用long类型。
如果在long和int占用存储空间相同的机器上编写代码,当确实需要32位整数时,应使用long而不是int,以便程序移植到16位机后任然可以正常工作。
- long常量和long long常量
通常程序中使用的数组都被存储为int,当数字超出了int类型能表示的范围,编译器就会将其视为更大一种的类型,直到能够表示该数字。
常量显示指导数据类型,可以在值的末尾加上l或L(long)后缀、ll或LL后缀(long long)、u或U(unsigned)。
整数溢出:当超过最大值,重新回到最小值开始计数。
- 打印short、long、long long和unsigned类型
类型 | 转换说明 |
---|---|
unsigned int | %u |
long | %ld:十进制、%lx:十六进制、%lo:八进制 |
short | %hd:十进制、%hx:十六进制、%ho:八进制 |
unsigned long | %lu |
unsigned short | %hu |
额外说明:
1. C标准只规定了允许的最小大小,因此某些数据类型的占用存储大小依计算机系统而异,占用存储越大所能表示的值范围也越大。 2. 一般而言,一个int占用一个机器字长。 3. 一般而言,系统用一个特殊位的值表示有符号数的正负号。 4. 如上,因为符号位会占用掉一位,所以无符号比有符号能表示更大的数。
char类型
char类型用于存储字符,但从技术层面看,char是整数类型。计算机使用数字编码来处理字符,即用特定的整数表示特定的字符。如美国最常用的ASCII编码,标准ASCII码的范围是0~127,只需七位二进制数即可表示。
- 声明
char response;
char itable,latan;
- 字符常量和初始化
char grade = 'A';
非打印字符
浏览ASCII表会发现,有些ASCII字符打印不出来。C语言提供了3种方法表示这些字符- 使用ASCII码
char beep = 7;
- 使用特殊符号序列表示一个特殊字符。这些符号叫转义序列。
char nerf = '\n';
- 使用十六进制形式表示字符常量。
转义序列如下表:
- 使用ASCII码
转义序列 | 含义 |
---|---|
\a | 警报 |
\b | 退格 |
\f | 换页 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\\ | 反斜线(\) |
\' | 单引号 |
\" | 双引号 |
\? | 问号 |
\0oo | 八进制值(oo必须是有效的八进制数,即每个o可表示0~7中的一个数) |
\xhh | 十六进制值(hh必须是有效的十六进制数,即每个h可表示0~f中的一个数) |
- 打印字符
printf()函数用【%c】指明待打印的字符。如果用%d打印的是一个整数。 - 有符号还是无符号
不同的编译器把char实现为有符号和无符号,C语言允许在关键字char前使用signed或unsigned,这在用char处理小整数时很有用。
_Bool类型
_Bool类型用于表示布尔值,即逻辑值true和false。它仅占用1位存储空间,因为它只有两个值。
可移植类型
在stdint.h和inttypes.h头文件提供了可移植类型,如int32_t,表示32位的有符号整数类型,根据不同系统,编译器会找出同是32位的整数类型(如 int或long),并把int32_t作为其别名,这样就保证了在不同系统中使用相同类型的整数。
float、double和long double
浮点数的表示类似于科学计数法(即用小数乘以10的幂来表示数字)。该计数系统常用于表示非常大或非常小的数。科学计数法在计算机中的写法为指数计数法(或称为e计数法),e后面的数字代表10的指数。
- 声明
float noah, jonah;
double trouble;
float planck = 6.63e-34;
long double gnp;
- 浮点型常量
-1.56E+12
2.87e-3
- 打印
printf()函数使用【%f】转换说明打印十进制计数法的float和double类型浮点数,用【%e】打印指数计数法的浮点数;a和A表示十六进制格式的浮点数;打印long double类型要使用【%Lf】、【%Le】或【%La】转换说明。 浮点值的上溢和下溢:
- 上溢为当计算导致数字过大,超过当前类型能表达的范围时,C就会为此结果赋一个表示无穷大的特定值,而printf()显示该值为inf或infinity。
- 下溢表示当某个数指数部分已经是最小值,而一个操作会减小其指数部分(比如除以2),所以计算机只好把尾数部分向右移,空出一个二进制位并丢弃最后一个二进制数,虽然得到了结果但计算过程中损失了原末尾有效位上的数字。
复数和虚数类型
C语言有3种复数类型:float_Complex、double_Complex和long double_Complex。例如,float_Complex类型的变量应该包含两个float类型的值,分别表示复数的实部和虚部。复数的实部和虚部类型都基于实浮点类型来构成。
C语言有3种虚数类型:float_Imaginary、double_Imaginary和long double_Imaginary。
以下整理出主要的数据类型表格:
- 整型:
类型 | 占用存储大小 | 值范围 |
---|---|---|
char | 1 字节 | -128 到 127 或 0 到 255 |
short | 2字节 | -32,768 到 32,767 |
int | 2 或 4 字节 | -32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647 |
long | 4 字节 | -2,147,483,648 到 2,147,483,647 |
- 布尔类型:
类型 | 占用存储大小 | 值范围 |
---|---|---|
_Bool | 1位 | 0或1 |
- 可移植类型:
类型 | 占用存储大小 | 值范围 |
---|---|---|
int32_t | 4字节 | -2,147,483,648 到 2,147,483,647 |
- 浮点:
类型 | 占用存储大小 | 值范围 | 精度 |
---|---|---|---|
float | 4 字节 | 1.2E-38 到 3.4E+38 | 6 位小数 |
double | 8 字节 | 2.3E-308 到 1.7E+308 | 15 位小数 |
- 复数和虚数:
类型 | 说明 |
---|---|
float_Complex | |
double_Complex | |
float_Imaginary | |
double_Imaginary |
- 修饰符:
名称 | 说明 |
---|---|
signed | 有符号,即有负数,默认修饰符,可显式指定 |
unsigned | 无符号,即非负数全部为正数,最小为0 |
short | 更小类型数据,即被修饰的数据类型可以占用更少存储空间表示小范围值的整数 |
long | 更大类型数据,即被修饰的数据类型可以占用更大存储空间表示更大范围值的整数 |