语
言
第二讲 数据描述
程
序
设 预备知识
计
数据类型
常量与变量
不同类型数据间的转换
第
二
讲 < >
数
C
语
言
程
序
设
计 § 2.0 预备知识
计算机中数的表示及进制转换
数码、基与权
数码:表示数的符号
基:数码的个数
权:每一位所具有的值
第
二
讲 < >
数
C
语
言
程 数制 十进制数 二进制数 八进制数 十六进制数
序
设 数码 0~9 0~1 0~7 0~9,A~F,a~f
计
基 10 2 8 16
表示 十六进制:
二进制:
十进制: 4275=4×8³+2×8²
81AE=8×16³+1×16²
八进制: 1011=1×2³+0×2²
4956= +7×8¹+5×8º
4×10³+9×10² +10×16¹+14×16º
+1×2¹+1×2º
+5×10¹+6×10º
第
二
讲 < >
数
C
语
言
各种进制之间的转换
程 二进制、八进制、十六进制转换成十进制
序 方法:按权相加
设
计
例 (111011)2 = 1 × 2 5 + 1 × 2 4 + 1 × 2 3 + 0 × 2 2 + 1 × 21 + 1 × 2 0 =(59)
10
例 (136)8 = 1 × 8 2 + 3 × 81 + 6 × 8 0 =(94)
10
例 (1F 2 A)
16 = 1 × 16 3
+ 15 × 16 2
+ 2 × 16 1
+ 10 × 16 0
=(7978)
10
第
二
讲 < >
数
C 各种进制之间的转换 ( 整数 )
语 二进制、八进制、十六进制转换成十进制
言
程
方法:按权相加
序 十进制转换成二进制、八进制、十六进制
设
计
方法:连续除以基,从低到高记录余数,直至商为 0
例 把十进制数
例 把十进制数 59 转换成二进制数
159 转换成八进制数
例 把十进制数 459 转换成十六进制数
2 598 159 余余1 7
16
2 29 8459
19 余余余 111 3
16
2 14 8 2 余余余
28 120 2
2 71 0 余余11
16 2 3 7
2 03 余1 1 C B
2 1 (159)余 10=(237)8
1
(459)
0 10=(1CB)16 1 1 1 0 1 1
第
二
讲 < > (59)10=(111011)2
数
C
语 二进制与八进制之间的转换
言
二进制转换成八进制:从右向左,每 3 位一组(不足 3 位
程
序 左补 0 ),转换成八进制
设 八进制转换成二进制:用 3 位二进制数代替每一位八进制
计 数
000 ~ 0
001 ~ 1
例 (1101001)2=(001,101,001)2=(151)8 010 ~ 2
011 ~ 3
100 ~ 4
例 (426)8=(100,010,110)2=(100010110)2 101 ~ 5
110 ~ 6
111 ~ 7
第
二
讲 < >
数
C 二进制与十六进制之间的转换
语 二进制转换成十六进制:从右向左,每 4 位一组 0000 ~ 0
言 (不足 4 位左补 0 ),转换成十六进制 0001 ~ 1
程
十六进制转换成二进制:用 4 位二进制数代替每一 0010 ~ 2
序
设 位十六进制数 0011 ~ 3
计 0100 ~ 4
0101 ~ 5
例 (11010101111101)2=(0011,0101,0111,1101)2=(357D)16 0110 ~ 6
0111 ~ 7
1000 ~ 8
1001 ~ 9
例 (4B9E)16=(0100,1011,1001,1110)2=(100101110011110)2 1010 ~ A
1011 ~ B
1100 ~ C
1101 ~ D
1110 ~ E
1111 ~ F
第
二
讲 < >
数
C
语
言 字节和位 0
程
序
字节是计算机中存取数据的基本单位 1
2
设 每个字节有一个地址 3
计
一个字节一般由 8 个二进制位组成 4
5
每个二进位的值是 0 或 1 6
7
8
9
7 6 5 4 3 2 1 0 10
……...
第
二
讲 < >
数
C
语
言
程 数值的表示方法——原码、反码和补码
序
设 原码:最高位为符号位,其余各位为数值本身的绝对值
计 反码:
正数:反码与原码相同
负数:符号位为 1 ,其余位对原码取反
补码:
正数:原码、反码、补码相同
负数:最高位为 1 ,其余位为原码取反,再对整个数加 1
负数补码转换成十进制数:最高位不动,其余位取反加 1
第
二
讲 <
数
C
语
言
程 实型常量(实数或浮点数)
序 表示形式:
设
计 十进制数形式:(必须有小数点) 如 0.123,
.123, 123.0, 0.0, 123.
指数形式:( e 或 E 之前必须有数字;指数必须为整
数)如 12.3e3 ,123E2, 1.23e4 , e-5 ,
1.2E-3.5
实型常量的类型
默认 double 型
在实型常量后加字母 f 或 F ,认为它是 float 型
第
二
讲 <
数
C 字符常量
语
言 定义 : 用单引号括起来的单个普通字符或转义字符 .
如 ‘ a’ ‘A’ ‘?’ ASCII
程
序
字符常量的值:该字符的 ‘\n’ ‘\101’
码值
设 转义字符 : 反斜线后面跟一个字符或一个代码值表示
计 如 ‘ A’——65 , ‘ a’——97 ,
例 转义字符举例 ‘0’——48 , ‘\n’——10
转义字符及其含义:
main()
如 ‘ :
例\101’ -----------‘A’转义字符 ‘\012’ -----------’\n’
转义字符 含义 含义
{ ‘A’-------’\101’-------’\x41’--------65
‘\376’ -----------’’ ‘\x61’ -----------’a’ 屏幕显示 )
运行结果: (
\n printf("\101 换行C\n"); \t ABC 水平制表
\x42
‘\60’ -----------’0’ ‘\483’ ----------(×)
Isay:”How are you?”
\v printf("I say:\"How are you?\"\n"); \C Program\ 退格
垂直制表 \b
\r
printf("\\C Program\\\n");
回车 \f Turbo ‘C’ 换页
printf("Turbo \'C\'");
}\a 响铃 \\ 反斜线
Ch2_1.c
\' 单引号 \" 双引号
例 main() 运行结果:
第 \ddd 1 - 3 位 8 进制数代表的字符 \xhh 1 - 2 位 16 进制数代表的字符
二 { printf(“Y\b=\n”); 屏幕显示: =
讲 < } 打印机输出: ¥
数
C 字符串常量
语
言 定义:用双引号 (“”) 括起来的字符序列
程 存储:每个字符串尾自动加一个 ‘ \0’ 作为字
序
设 符串结束标志
计
例 字符串“ hello” 在内存中 h e l l o \0
例 空串 “” \0
字符常量与字符串常量不同
例 ‘ a’ a “a” a \0
例: char ch;
第 ch=“A”;
ch=‘A’;
二
讲 <
数
C 变量
语
言
概念:其值可以改变的量
程 变量名与变量值
序
设 变量定义的一般格式:
计 数据类型 变量 1[ ,变量 2 ,…,变量 n];
变量初始化 : 定义时赋初值
例: int a=1, b=-3,c;
决定分配字节数
变量的使用:先定义,后使用 int a,b,c;
合法标识符 例 :
…...
和数的表示范围
变量定义位置:一般放在函数开头 float data;
地址 int a=2,b,c=4;
main()
main() a float
1 data=3.67;
2 字节
例1
例2 { int
{ a,b=2;
int a,b=2; 地址 char ch=‘A’;
int student;
float a,b,c;
float data;
a=1; 变量定义b int -3
x=1,y=1,z=1;
2 字节
stadent=19; //Undefined symbol ‘statent’ in function main
c=a%b; a=1;//Illegal use of floating int x=y=z=1;(×)
point in function main
float data; 地址 可执行语句
data=(a+b)*1.2; c
data=(a+b)*1.2;
编译程序根据变量定义为其
×× 2 字节
第
二 printf(“data=%f\n”,data);
printf(“data=%f\n”,data);
分配指定字节的内存单元
…...
讲 < > 随机数
数 } } 内存
C
语 整型变量
言 占字节数随机器不同而不同 .
程
序 short≤int≤long
设 可用 sizeof( 类型标识符)测量
计
实型变量
float :占 4 字节,提供 7 位有效数字
double :占 8 字节,提供 15~16 位有效数字
例 float a;
字符型变量
a=111111.111; /* a=111111.1*/
字符变量用来存放一个字符常量,存放其 ASCII 码值
double b;
char 与 int 数据间可进行算术运算
b=111111.111; /* b=111111.111*/
例 a=‘D’; /* a=68; */
第 没有字符串变量,用字符数组存放
x=‘A’+5; /* x=65+5; */
二
讲 s=‘!’+‘G’ /* s=33+71; */
数
< >
C
语 字符数据与整型数据可以相互赋值
言
程
序 i ASCII值为97 ch ASCII值为98
设
计 0 1 1 0 0 0 0 1 0 1 1 0 0 0 1 0
#include”stdio.h”
main()
{int i=‘a’;
Ch2_2.c
char ch=98;
printf(“%c,%d\n”,i,i);
printf(“%c,%d\n”,ch,ch);
第
}
二 运行结果: a,97
讲 < >
数 b,98
C
语 例 : #include"stdio.h"
言 #define PRICE 12.5 宏定义
程
序 main()
设 { int num=3;
计 float total; 变量定义及数据输入
char ch1,ch2=‘D’;
total=num*PRICE;
ch1=ch2-‘A’+‘a’; 数据处理 输出结果
printf("total=%f,ch1=%c\n",total,ch1);
}
运行结果:
total=37.500000, ch1=d Ch2_3.c
第
二
讲
数
C
语
言
程
§ 2.3 不同类型数据间的转换
序 隐式转换
设
计 什么情况下发生
运算转换 ------ 不同类型数据混合运算时
赋值转换 ------ 把一个值赋给与其类型不同的变量
时
输出转换 ------ 输出时转换成指定的输出格式
函数调用转换 ------ 实参与形参类型不一致时转换
运算转换规则 : 不同类型数据运算时先自动转
换成同一类型
第
二
讲 < >
数
C double float 说明 :
高
语
言
程 必定的转换
long
序
设 运算对象类型不同时转换
计
unsigned
例 int i;
int char,short float f;
低 double d;
long l;
二 }
讲
数 结果: x=3.600000,i=3
作业 与上机
C
语 1. 编写一程序,将一个大写字母转换成小写字母。
言
程 2. 写出下面程序的运行结果。
序
设 main()
计
{char c1='a',c2='b',c3='c',c4='\101',c5='\116';
printf("a%cb%c\tc%c\tabc\n",c1,c2,c3);
printf("\t\b%c%c\n",c4,c5);}
3. 求下面算术表达式的值。
(1)x+a%3*(int)(x+y)%2/4
第
设 x=2.5,a=7,y=4.7
二 (2)(float)(a+b)/2+(int)x%(int)y
讲
数 设 a=2,b=3,x=3.5,y=2.5