You are on page 1of 20

C 语言程序设计

第三章:数据类型

授课 师习之

湘潭大学物理与光电工程学院
本节内容

1 、数据的表示——常量、变量、标识符;
2 、数据的存储——二进制数与字节;
3 、 C 语言的基本数据类型。
C 语言的常量、变量与标识符
常量:数据本身,比如整数 1 ,小数 1.23 ,一段文字: hello,
world!
变量:内存中保存数据的存储单元。其中存储的内容称为变量值。
我们会为每个变量取一个名字,称为变量名。

常量不可以改变!
变量则可以通过赋值改变其中保存的内容。

int x, y;
x=123; y=456;
printf(" 变量 x 的值为 %d, 变量 y 的值为 %d ,一个数 %d\n", x, y,
233);
x=y; y=789;
printf(" 现在 x 的值变成了 %d, y 变成了 %d\n", x, y);
1=2; XXX 错误!常量不能赋值!
C 语言的常量、变量与标识符
C 语言中的常量:以内容本身表示数据,在代码中书写时要按照特定格
式。
类型 含义 代码书写格式 示例
1 、十进制形式,后可加一个字 1, 123, -5, 100L,
整型常量 表示整数 母 l 或 L 表示长整型; 0x1, 0x7B, 0xffff
2 、十六进制形式,以 0x 开头。
1 、小数形式,需要包含小数点;
或者后加字母 f 表示单精度, 1.23, -1., 1f, 5d,
浮点型常量 表示浮点数 加 d 表示双精度; 3e8, 1.23e-2
2 、指数形式,用字母 e 或 E 分
隔有效数字和指数部分。
以单引号 ' 括起来单个字符;
'a', 'B', '3',
字符型常量 表示单个字符 换行符等不可显示的特殊符号 '?',
用反斜杠 \ 开头的转义字符表 '\n', '\t', '\012'
示。
"Hello!",
以双引号 " 括起来的多个字符, "3.1415",
字符串常量 表示一段文本
也可以包含转义字符。 " 一 \n 二 \n 三 \n"
C 语言的常量、变量与标识符
C 语言中的宏定义,或称符号常量,就是用预处理指令为频繁用到的内
容起一个较简洁的名字来代表,格式是: #define 宏名 内容
#define PI 3.141592657
#define MY_ADDRESS " 湖南省湘潭市湘潭大学物理与光电工程学院 "
y=sin(x*PI/180);
printf(" 地址: %s\n", MY_ADDRESS);

提示:预处理指令不是 C 语言语句,末尾不要加分号!
扩展:宏定义的本质是在编译开始前对代码进行文本替换,所以如果宏名与代码
文本中其他部分有重复时可能会导致错误:
int PIESIZE; PIESIZE=12;
此段代码经预处理后会变为:
int 3.141592657ESIZE; 3.141592657ESIZE=12;
这是一个错误,因为变量名不能以数字开头。

但相对的, #define 除了表示符号常量,也可以用于给一些常用表达式起别名:


#define RNDF ((float)rand()/RAND_MAX) # 获取 0 到 1 之间的随机数
C 语言的常量、变量与标识符
C 语言中的变量,内存中的存储位置。不同变量有各自的名称,称为变
量名,其类型称为变量类型,其在内存中的位置序号称为地址,其
中存储的内容称为变量值。其中变量地址是由编译器和系统自动分配的。
定义变量,即说明要使用的变量的名称和类型。
变量定义的格式为:类型关键字 变量名 ;
相同类型的变量定义可以放在一起,用逗号隔开。
int a; // 定义一个 int 类型的变量 a
float x, y, z; // 同时定义三个 float 类型的变量
引用变量,即取出变量的值,以便进行计算处理。
引用变量的格式为:直接将变量名写在需要使用其值的位置。
y=x*x+2; // 在表达式中引用变量 x
printf("x=%d\n", x); // 在函数调用中引用变量 x
扩展:在 release 发布版的程序中,并不包含变量名,每个变量在程序文件的机器
代码中都被替换为具体的内存地址。只有 debug 调试版程序中可能会记录变量的名
称,以方便在调试时阅读和辨认。
C 语言的常量、变量与标识符
C 语言中的常变量,变量定义时在前面加修饰关键字 const ,作用是
标记变量的内容不会被修改。常变量只能且应该在定义时赋值。
const int N=100; // 常变量定义语句:整型常变量 N
const char FileName[]= "data.txt"; // 字符串型常变量 FileName
const int A; // 错误,常变量在定义时应该赋值!否则没有意义。
N=1; // 错误,常变量不能被修改!

可以将不需要修改的固定数据定义为常变量,其作用主要有:
1 、避免数据被错误地修改;
2 、编译器可以针对性地进行代码优化,提高运行效率。
const double PI=acos(-1.0); // 用反余切函数计算圆周率并定义为常量
常变量 const 与宏定义 #define 的区别:
常变量本质上也是变量,只是被标记为不可修改。
而宏定义则仅是在预处理时对代码文本做字符替换,具体是什么(常量、
变量还是表达式?)取决于定义时指定的内容。
C 语言的常量、变量与标识符
C 语言的标识符,即给变量、常变量、函数、数组、自定义类型等起的
名字,比如变量名、函数名都属于标识符。一些标识符可以由代码编写者
指定,但需要满足特定规则:
标识符只能以字母、数字、下划线组成,且数字不能出现在开头。另外,
标识符也不能与关键字或已有的其他标识符重复,包括调用的库函数名等。

正确示例: sum, Avg, _total, file_name, x1, m, N, pos_1_2 ;


错误示例: J. Smith, 3D, $var, a@b, my.name, int, printf ;

关键字:即 C 语言规则中保留的具有特殊含义的标识符。包括:所有基
本数据类型关键字如 int; 类型修饰关键字,如 const ;语句关键字 if,
else , for, while, do; 等等。

C 语言是区分大小写的!比如: X 与 x 不同,变量类型 int 不能写为 INT 。


所以从语法上讲 INT 可以用作变量名,但一般不建议这样,以免阅读时发生
误解。
C 语言的常量、变量与标识符
C 语言中保留的关键字:
auto break case char
const continue default do
double else enum extern
float for goto if
int long register return
short signed sizeof static
struct switch typedef union
unsigned void volatile while
其中, double 、 float 、 int 等为数据类型关键词,其他还包括类型修饰关
键字如: signed 、 const 、 static 等,语句关键字如: if 、 for 、 while 等
等。
二进制数与字节
计算机数据在内存中的存储方式——二进制数字: 十进制 二进制
0 -> 0
十进制:逢 10 进 1 ,用 0,1,2,3,4,5,6,7,8,9 共十种符号组成; 1 -> 1
二进制:逢 2 进 1 ,用 0 和 1 两种符号表示; 2 -> 10
3 -> 11
二进制数(自然数)换算为十进制数: 4 -> 100
二进制数从右起,第 i 位的 1 表示 2 的 i-1 次方,比如: 5 -> 101
(10010011)2=(1×27+1×24+1×21+1×20)10=(128+16+2+1)10=(147 ......
)10 256 ->
十进制数(自然数)换算为二进制数: 1后8个0
十进制数不断除 2 ,每次记录余数(必然是 1 或者 0 ),直到被除 1024 ->
数变为 0 ,然后将每次得到的余数依次从右往左排列起来为二进制 1 后 10 个
数: 0
(11)10: 11÷2=5…1, 5÷2=2…1, 2÷2=1…0, 1÷2=0…1 。
(11)10 =(1011)2 。
十六进制:逢 16 进 1 ,用 0 到 9 加上字母 A 到 F 共十六种符号组成。
八进制:逢 8 进 1 ,用 0 到 7 共八种符号组成。
二进制数与字节
内存中的基本存储单元——字节:
地址 …… 0x1F08 0x1F09 0x1F0A 0x1F0B 0x1F0C ……

内容 …… 10010010 11101001 00101000 11110111 01010001 ……

内存中的存储单元可储存 8 位长的二进制数,称为一个字节。
1 、一个字节可表示 2 的 8 次方种状态,即 256 种。比如用 1 个字节表示自然数时,
可表示的范围是 0 到 255 。
2 、计算机在读取、写入内存数据或进行计算时,每次最少处理一个字节(即 8 位
长的二进制数),不能更短。
3 、内存的地址,即每个最小存储单元的序号,也是由数字表示的。如果用一个字
节长的数表示地址,则内存最大只能有 256 字节。
4 、一般的计算机还可以将连续的 2 个字节或者 4 个、 8 个字节,合并起来当作一
个数处理(读写、数学运算等),且随着计算机硬件技术的发展,还会不断变长。
5 、不同字节长度的数的运算指令不同,现代电脑一般同时具有针对多种不同字长
的数据进行运算的指令。计算机单条指令能运算的最大字节数,称为机器的字长。
比如目前主流的个人电脑是 64 位,即最大能一次计算 8 字节长的数。
C 语言的数据类型
什么是数据类型:
可以用不同长度的二进制数表示不同范围或精度的数据:
比如,用二进制表示自然数时,
1 字节长的范围是 0 到 255 ( 28-1 );
2 字节长的范围是 0 到 6 5535 ( 216-1 ),数万级别 ;
4 字节长的范围是 0 到 42 9496 7295 ( 232-1 ),数十亿 ;
8 字节长的范围是 0 到 1844 6744 0737 0955 1615 ( 232-1 ),数千亿亿 。
同样长度的二进制数也可以表示不同种类的数据:
1 、以二进制数表示自然数(如前所述)——无符号整数;
2 、将二进制其中某一位作为正负号标记,从而可以表示负数——有符号整数;
3 、将二进制中一段用于表示指数,其他表示有效数字,类似于科学记数法,则可以表示小
数或实数——浮点数。
4 、将不同的二进制数作为编号来标记每个文字字符——字符型数据、字符串。

在计算机内部,处理不同类型的数据的指令是不同的!比如,整数
1+2 ,与浮点数 1+0.2 ,从数学上讲都是加法,但计算机内部却需要使用两条不
同的指令处理——整数加法指令与浮点数加法指令。
C 语言编译器需要根据参与运算的数据的类型来决定采用什么指令,这就是为什
么 C 语言的变量或函数必须在使用前先定义或声明。
C 语言的数据类型
C 语言的基本数据类型: 基本类型
整型
基本整型 int
有符号整型 [signed] int
无符号整型 unsigned int
短整型 short [int]
有符号短整型 [signed] short [int]
无符号短整型 unsigned short [int]
长整型 long [int]
有符号长整型 [signed] long [int]
无符号长整型 unsigned long [int]
浮点型
单精度浮点型 float
双精度浮点型 double 枚举类型 enum
指针类型 *
字符型
有符号字符 [signed] char
其他类型 空类型 void 数组类型 [ ]
无符号字符 unsigned char 派生类型 结构体 struct

共用体 union

函数类型 ()
C 语言的数据类型 - 整型
整型:
类型关键词 int, unsigned int short, unsigned short long, unsigned long
常量标记 无,例如: 123 无,例如: 123 l 或 L ,例如: 123L
长度(字节) 不定,取决于编译器 不定,但不大于 int 不定,但不小于 int
数值范围 2 、 4 、 8 字节的有符号整数分别约正负: 3 万, 20 亿, 900 亿
亿。
printf 格式标记 %d ,无符号为 %ud %h ,无符号为 %uh %l ,无符号为 %ul
scanf 格式标记 同 printf 同 printf 同 printf
int x=-1; // 定义整型变量 x, 并赋值 -1 。
unsigned int n=123; // 定义无符号整型变量 n ,注意无符号整数不能为负数。
short num; // 定义短整型变量 len 。
unsigned short len; // 定义无符号短整型变量 len 。
long Count=0; // 定义长短整型变量 Count 。
unsigned long ID=202212345; // 定义无符号长短整型变量 ID 。
printf("%d %hd %ld\n", x, num, Count); //short 要加 h , long 要加
l。
printf("%u %hu %lu ", n, len, ID); // 无符号要用 u 而不是 d 。
scanf("%d %hd %ld", &x, &num, &Count); // 与 printf 相同。
C 语言的数据类型 - 整型
关键字 sizeof :用于获取某个变量或变量类型的长度(即在内存中所
占用的字节数),调用格式是:
sizeof( 变量 ) ,或者, sizeof( 变量类型 )
long a;
printf(" 变量 a 的长度是: %d\n", sizeof(a));
printf(" 类型 int 的长度是: %d\n", sizeof(int));

结果可能是:
变量 a 的长度是: 4
类型 int 的长度是: 4

在不同编译器上可能显示不同的结果。
在同一个编译器中是固定不变的,可以认为 sizeof 得到的是一个整型常数。
C 语言的数据类型 - 浮点型
浮点型:
类型关键词 float double
常量标记 f ,例如 1.0f 小数点,或 d 例如:
1.0 , 1.0d 。
长度(字节) 4 8
数值精度 6 位有效数字 15 位有效数字
printf 格式标记 %f %f
scanf 格式标记 同 printf %lf

float x=1.23f; // 定义单精度浮点数变量 x , 1.23 后的 f 表示单精度。


double y=3.14d; // 定义双精度浮点数变量 y 。
printf("%f %f\n", x, y); //printf 中两种浮点数都可以用 %f 表示。
scanf("%f %lf", &x, &y); //scnaf 中用 %f 表示 float , %lf 表示
double 。
C 语言的数据类型 - 字符型
字符型:
类型关键词 char, unsigned char
常量标记 单引号 '' 括起,例如 '1', 'a', '?', '\n'
长度(字节) 1
数值精度(表示整数时) 有符号 -128-127 ,无符号 0-255
printf 格式标记 %c
scanf 格式标记 同 printf
char c='1', b; // 定义字符变量 c, b ,并赋值 c 为字符 '1' ,注意不是数
字1。
b=c+1; // 字符变量作为整数进行运算
printf("%d %c\n", c, c); // 分别以整数和字符形式显示字符 '1' ,字符用
%c 表示。输出: 49 1
printf("%d %c\n", b, b); // 输出: 50 2
printf("%d\n", 'A'); // 显示大写字符 A 对应的整数,输出: 65

scanf("%c", &b); // 读取单个字符,用 %c 表示。


C 语言的数据类型 - 字符型
字符集:规定了整数与字符的对应关系,有多种不同的字符集。
英文字符最基本的是 ASCII 码。
数字 字符 解释 数字 字符 解释 数字 字符 解释 数字 字符 解释
0 (NULL) 空字符 \0 36 $ 48-57 0-9 94 ^
7 (Bell) 响铃 \a 37 % 58 : 95 _
8 (Backspace) 退格 \b 38 & 59 ; 96 `
9 HT 水平制表符 \t 39 ' \' 60 < 97-122 a-z
10 LF 换行键 \n 40 ( 61 = 123 {
11 VT 垂直制表符 \v 41 ) 62 > 124 |
12 NP 换页键 \f 42 * 63 ? \? 125 }
13 CR 回车键 \r 43 + 64 @ 126 ~
32 (Space) 空格 44 , 65-90 A-Z 127 DEL 删除键
33 ! 45 - 91 [
34 " \" 46 . 92 \ \\
35 # 47 / 93 ]
注意观察规律,其中数字 0-9 、大小写英文字母都是连续的,并且大写字母
比对应小写字母的数值小 32 ,该规律可用于转换大小写。
扩展:中文等语言需要两个字节表示一个字符,称为双字节或宽字节字符,有些编译器用
t_wchar 表示该类型,也可用 short 变量存储。
内容小结
常量,变量,符号常量(宏定义 #define ),常变量( const 变量)。
 标识符:变量、函数等的名字。
 字母、数字和下划线;
 不能以数字开头;
 区分大小写。
 二进制:表示自然数时,逢二进一。
 字节:计算机内存的最小存储单元, 1 个字节表示 8 位长的二进制数。
C 语言的基本数据类型:整型、浮点型、字符型。
 整型:表示整数。 int, long, short, unsigned int, unsigned long,
unsigned short 。 %d, %ld, %hd, %u, %lu, %hu 。
 浮点型:表示小数或实数。 float, double 。 %f, %lf ( scanf 需区分)。
 字符型:表示整数和字符。 char, unsigned char 。 %d, %u, %c 。
C 语言的 sizeof 关键字: sizeof( 变量名 ) , sizeof( 数据类型 ) 。
练习题 3
1 、编写程序,对所有 C 语言基本数据类型,进行如下操作:定义变量、
用 sizeof 确定其实际字节长度、用对应类型常量对其进行赋值、用
scanf 读取数据到变量、最后用 printf 输出变量的值。(提示, 1 、变
量名任意,常量值任意,只要满足语法规则; 2 、 sizeof 得到的结果可
视作整数 int ,故可用 %d 标记通过 printf 输出)

2 、编写程序,查询输入的一个字符的 ASCII 码(提示, char 类型也可


以表示整数,故除了 %c 也可用 %d 通过 printf 输出)。

20

You might also like