21天学通C语言-学习笔记(4)

会有一股神秘感。 提交于 2020-01-13 10:20:05

第4章 基本数据类型

本章将重点介绍C语言提供的三组基本数据类型的使用,包括:整型、字符型和浮点型。C语言的其他高级数据类型实质上都可以视为这些基本数据类型的组合。通过本章的学习,要掌握以下知识:

  • 各种整型数据类型的使用;
  • 各种字符型数据类型的使用;
  • 各种浮点型数据类型的使用;
  • 使用 printf 函数和 scanf 函数处理各种类型的数据;
  • 使用 typedef 自定义数据类型;
  • 限定词 const 和volatile的使用。

4.1 整型数据类型

C语言定义了4种整型数据类型以表示不同大小的整数数值。

  • short int:短整型
  • int:整型
  • long int:长整型
  • long long int:长长整型

本节将介绍各种整型数据类型的字节长度、整型常量和整型变量的使用,以及使用整型类型的存储方式和范围。

4.1.1 字节长度

在不同的编译器和不同的硬件环境中,整型数据类型的字节长度可能不同,但是都具有以下关系:short int 型的长度不大于 int 型的长度,int 型的长度不大于 long int 型的长度,long int 型的长度不大于 long long int 型的长度。

【范例4-1】 输出各整型的字节长度,实现方法如示例代码4-1所示。

示例代码4-1

   #include <stdio.h>

   int main(void){
        printf("sizeof(short int) = %d\n, sizeof(short int)"); 
                                                               /*输出short int型的字节长度*/
        printf("sizeof(int) = %d\n, sizeof(int)");             /*输出int型的字节长度*/
        printf("sizeof(long int) = %d\n", sizeof(long int));  
                                                               /*输出long int型的字节长度*/
        printf("sizeof(long long int = %d\n)", sizeof(long long int)); 
                                                               /*输出long long int型的字节长度*/

        return 0; 
}

【代码解析】程序中是用来字节操作符sizeof,其使用方式为: sizeof(数据类型)

sizeof 的作用是得到数据类型所占空间,以字节为单位。括号中也可以是变量、常量或其他表达式。

4.1.2 符号修饰符

C语言中,signed 和unsigned 称为符号修饰符,可以用来作为上面四种整型数据类型的前缀,以组成有符号整数和无符号整数。带signed 前缀的数据类型和没有符号修饰的整型一样,都可以表示所有的整数;而带unsigned 修饰的数据类型都只能用来表示无符号数,即非负整数。

符号修饰符不会改变数据类型的字节长度,所以signed 和unsigned 型所能表示的整数个数是一样的,但是它们表示的整数范围是不同的。

4.1.3 整型常量

整型常量是指用以表示整型数值的常量,有四种。每种分为有符号型和无符号型。

4.1.4 整型变量

整型变量是指用以存储整型数值的变量,有四种。每种分为有符号型和无符号型。

4.1.5 存储方式

整型按照存储方式和数值区间的不同,可分为两大类:有符号整型和无符号整型。有符号整型在内存中的存储分为两部分:符号部分和数值部分。

符号部分占1位。0为非负数,1为负数。其余部分都属于数值部分,整数变量的数值以二进制的形式存放在该部分中。而无符号整型的存储方式相对简单,只有数值部分。

4.1.6 数值范围

不同整型数据的字节长度不同,因此,它们可表示的数值范围也是不同的。

4.2 字符型数据类型

C语言中的字符型数据只有一种,即 char 型数据类型。使用符号修饰符还可以得到无符号字符型和有符号字符型。

4.2.1 字节长度

在C语言标准中,char 型的字节长度被定义为1,即8位。

4.2.2 字符常量

字符常量,即用以表示字符的常量。C语言中的字符常量都包含在单引号中,单引号内具体的内容可以分为两种。

  1. 单个字符:单个字符常量是指单引号内只含一个字符的常量。

  2. 转义字符:以反斜杠(\)开头的转义字符,其作用是把反斜杠后面的字符转换为特定形式。

4.2.3 字符变量

字符变量是用于存储字符型数值的变量。字符型变量也有两种:有符号型和无符号型。对字符型变量有两种赋值方式。一种是字符常量,另一种是整型数值赋值,整型数值会自动转化为相应的ASCII码赋值给字符变量。
(此处易忽略)比如: char c1 = 97; 此处97为ASCII值,对应的控制字符为‘a’

【范例4-7】展示字符型变量的使用,实现方法如示例代码4-7所示。

示例代码4-7

#include <stdio.h>
#include<stdlib.h>     //为了解决VS2013闪退加的

int main(void) {
	char c1 = '\n';
	unsigned char c2 = '\t';
	char c3 = 49;
	
	printf("c1 = [%c], [%d]\n", c1, c1);
	printf("c2 = [%c], [%d]\n", c2, c2);
	printf("c3 = [%c], [%d]\n", c3, c3);
	system("pause");     //为了解决VS2013闪退加的
	
	return 0;
}

【运行结果】程序运行后,得到结果如图4-10所示。

图4-10 字符型变量的使用
在这里插入图片描述
【代码解析】转义字符‘\n’的作用是换行,第一个printf函数里的 %c 处会替换为 ‘\n’,输出到终端上则会替换为换行;%d则为 c1 的 ASCII 码值代替。转义字符 ‘\t’ 的作用为水平制表,第二个 printf 里的%c 会替代 ‘t’, 输出到终端上,则替代为水平制表(即跳到下一个Tab位置),%d 同样被 c2 的 ASCII 值代替。数值 49 对应的 ASCII 码为’1’,第三个 printf 里的%c 将替代为‘1’,%d 将替代为整数49。

4.2.4 存储方式

字符型数据类型的存储方式和整型十分相似。

  • 有符号字符型和有符号整型一样,最高位为符号位,其余部分都属于数值部分,其值等于该字符型数据的数值的绝对值。

  • 无符号字符型只含数值部分。

4.3 浮点型数据类型

C语言共定义了三种浮点型数据类型来表示不同精度和不同数值范围的浮点数。

  • Float:单精度型;
  • Double:双精度型;
  • long double:长双精度型。

本节先讨论字节长度,再讨论浮点型常量和变量的使用,最后讨论各个浮点型数据类型的精度、数值范围和存储方式。

4.3.1 字节长度

规定:float 型不大于 double 型,double 型不大于 long double 型。在不同编译器和不同硬件环境下,各类型的字节长度有所变化。Visual C++ 2005 环境下,float 型字长为 4 字节,即 32 位;double 型和 long double 型字长为 8 字节,即 64 位。

4.3.2 浮点型常量

浮点型常量是用以表示浮点数值的常量。C语言中的浮点型数值默认为双精度类型,可以使用 f 或 F 作为后缀得到单精度型常量,或使用 l 或 L 作为后缀得到长双精度常量。它们的表示有小数和指数两种形式。

  • 小数形式的示例有:1500.13/3.1415926、-0.007。
  • 指数形式有三部分:数值1、e 或 E、数值2,其值等于(数值1)×(10
    的(数值2)次方)。上述小数形式的示例用指数形式表示依次为:1.50013e3、31415.926E-4、-0.7e3,中间的e大小写均可。
  • 浮点型常量的整数部分为 0 时,省略整数部分的 0 也是合法的,比如:-0.007 可以写为-.007,-0.7e3可以写为-.7e3。
  • 指数形式中,e 前面必须为数字,也必须有数字;e 后面必须为整数,也必须有整数。

4.3.3 浮点型变量

浮点型变量是用以存储浮点型数值的变量。三种浮点型变量定义变量的形式:

  • float f ;
  • double d ;
  • long double ld ;

printf 函数与 scanf 函数处理浮点型数据的格式如下表所示:

数据类型 字节长度 精度 数量级范围(10的次方) printf 和 scanf 格式
float(f) 4 7 -38 ~ 38 %f
double 8 约16 -308 ~ 308 %f
long double(l) 12 约19 -4932 ~ 4932 %llf

4.3.4 精度

不同浮点型的精度不同,精度从低到高依次为 float 型、double 型和 long double 型。精度是指精确到小数点后的位数,位数越多,精度越高。

4.3.5 数值范围

不同浮点型可表示的数值范围也不同,由于浮点型在内存中是以科学计数法的方式来存储的,其数值范围只能使用数量级范围来表示。可表示的数量级范围从小到大依次为 float 型、double 型和 long double 型。

4.3.5 存储方式

以 Linux 下的 GCC 3.2.2 的实现为例,讨论浮点型的存储方式。

1.符号位:浮点型的符号位只有一位,为其最高位。如果该位为1,则表示其为负数;如果该位为0,则表示其为非负数。

2.指数位:浮点型的指数为以补码形式存储,其科学计数法表示形式的指数部分。指数位决定浮点型可存储的数值范围。但,真正的指数值为该类型的偏差值减去该存储值的结果。每种类型的偏差值是固定的。

3.基数位:基数位是浮点型的最后一部分,其位数决定了精度。

4.4 用户自定义类型

除了C语言自带的数据类型外,程序员还可以使用关键字 typedef 定义数据类型。

标准形式: /*typedef 原数据类型 新数据类型 */

如:typedef char myChar;
使用 typedef 可以简化复杂的类型声明;提高程序的可维护性和可移植性;自定义数据类型集。

4.5 限定词 const 与 volatile

它们是两个数据类型限定词,均在变量定义中使用。使用 const 的形式如下:

const 数据类型名 变量名 = 初始值;

或者:数据类型名 const 变量名 = 初始值;

使用 const 变量有以下好处:提高程序的可读性;提高程序的可维护性;避免只读变量被意外修改;提高程序效率。

使用 volatile 告诉编译器其修饰的变量是随时可能变化的,编译器优化时必须每次都重新读取这个变量的值,而不是使用保存在寄存器里的备份。volatile 无须初始化,标准使用形式为:volatile 数据类型名 变量名;
或:数据类型名 volatile 变量名;
volatile 限定词的主要目的是提示编译器,每次读取器数据时,都会老老实实地从内存中读取,不会对其优化,在多线程环境下经常使用 volatile 变量。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!