数据类型
冯.诺依曼计算机
- 指令和数据都同样存储在内存中
- 都以二进制(Binary)形式存储在内存中
为什么用二进制存储?
- 二进制在电器元件中容易实现,双稳态元件很多 电压的高和低、电容器的充电与放电、脉冲的有与无、晶体管的导通与截止
- 二进制运算比进行十进制运算简单得多
- 二进制易于实现物理上对数据的存储(如光盘等),且与逻辑判断正好可以形成一一对应的关系 用1表示“真”,用0表示“假”
- 诠释了计算机哲学——复杂事物由简单事物构成
何为二进制?
十进制数
- 用0~9这10个数中的一个表示十进制的一位数
- “逢10进1”的进位原则,基为10
- 每位数字都有一个权值,是10的幂次
- 十进制表示的数值可以写成按位权展开的多项式之和
二进制数
- 用0或1表示二进制中的一位数
- “逢2进1”的进位原则,基为2
- 每位数字都有一个权值,是2的幂次
- 可写成按位权展开的多项式之和
如何表示二进制的正与负?
有符号和无符号整数的区别在于怎样解释其最高位
- 对无符号整数,最高位被C编译器解释为数据位
- 对有符号整数,最高位被解释为符号位(0为正,1为负)
0怎么办?0的表示还能唯一吗?
- +0的二进制是00000000 00000000
- -0的二进制是10000000 00000000
负数以二进制补码(Complement)形式存储
- 便于用统一的形式来表示0
- 便于将减法运算也转化为加法运算来处理
补码如何计算?
- 正数的反码、补码与其原码都是相同的
- 负数补码,符号位不变,原码变反码,反码+1变补码
- +0和-0的补码是相同的
-1的补码如何计算?
- 将最高位解释为符号位,则该数就是-1
- 将最高位解释为数据位,则该数就是
计算机的内存是如何编址的?
- 内存——计算机内的存储部件
- 内存的特点:速度快,可随机访问,但掉电即失
- 内存中的存储单元是一个线性地址表
- 内存地址按字节(Byte)编址:每个字节都用唯一的一个整数字来标识——地址 ;地址是一个十六进制无符号整数
- 32位计算机的内存地址编码是32位,从0x00000000到0xFFFFFFFF
如何衡量内存空间的大小?
计算机存储数据的最基本单元
- 衡量物理存储器容量的最小单位——位,也称比特
一个位(bit)有多大?
- 只能是0或者1,二进制
- 一个位无法表示太多数据,所以须将许多位合起来使用
字节(Byte):8位(bit)
字节(Byte)是最小的可寻址的存储器单位
- 通常用字节数的多少来衡量内存空间的大小
- 标识字符的最小单位
引入数据类型
对计算机系统和硬件本身而言,数据类型(Data Type)的概念其实是不存在的
- 冯· 诺依曼体系结构中,程序代码和数据以二进制存储
引入数据类型的主要目的
- 有效地组织数据,把数据分成所需内存大小不同的数据
- 规范数据的使用
- 提高程序的可读性
- 方便用户的使用
C语言中有哪些数据类型
不同数据类型可参与的运算不同
整型
加、减、乘、除、求余(模)
实型
加、减、乘、除
字符型
加、减(整数)
对ASCII码值的运算
常量与变量
常量:在程序中不能改变其值的量
变量 :其值在程序执行过程中是可以改变的
在程序中不能改变其值的量
整型 默认为int
实型 默认为double
字符型 用\开头的字符为转义字符, 代表1个字符
字符串
枚举型
整型常量
整型常量就是整数,包括正整数、负整数和0
C语言中整型常量可以用以下三种形式表示:
① 十进制整数:有效数字为0~9。20 %d
② 八进制整数:有效数字为0~7,且以0开头,如020。%o
③ 十六进制整数:有效数字为0~9和a~f(或A~F),且以0x开头,如0x20。%x
实型常量
定义:实型常量是带小数点的数 表示形式:
①十进制小数形式 由正负号、数字0~9和小数点组成。小数点不能省 如: 3.14 0.8 .8 0.0 -36.625 100.00 100.
②指数形式(或称科学记数法) 由正负号、数字0~9、小数点和字母e或E组成。 表示形式: me±n 或 mE±n 。 表示m×10^(±n) ,其中m为整型数或实型数,n为整型数,m和n都不能省略,格式中“+”可以省略。
字符常量
定义:用一对单引号括起来的一个字符。 如’a’、’7’、’#’、’$’。
字符常量的值:是该字符的ASCII码。
‘0’ 的ASCII码48 ‘A’ 的ASCII码为65 ‘a’ 的ASCII码为97 ’\n’的ASCII码为10
C的转义字符:以“\”开头的字符序列。 反斜线后面跟一个字符或一个代码值表示
字符串常量
- 定义:用双引号(“”)括起来的字符序列,可以是零个、一个或多个字符
- 字符串长度:字符序列中含有的字符个数
- 存储:每个字符串尾自动加一个‘\0’作为字符串结束标志
- 字符串在内存中的存储长度=字符串长度+1。
- 区分字符常量与字符串常量不同
- 字符串常量中的字符可以是转义字符,转义字符代表一个字符。
例题:字符串“ab\n\\cd\xe”的长度是?
利用系统提供的strlen函数可以测试字符串的长度。 注意使用前必须用下面文件包含命令:
#include <string.h>
//测试举例:
#include <stdio.h>
#include <string.h>
int main( )
{
printf("length=%d",strlen("ab\n\\cd\xe"));
return 0;
}
〖运行结果〗: length=7
例题:字符串“\”EOF\n=-\61\“”的长度是
利用sizeof运算符可以测试字符串在内存中的大小(字节数)。
#include <stdio.h>
#include <string.h>
int main( )
{
printf("%d ", sizeof("ab\n\\cd\xe"));
return 0;
}
sizeof(int);
sizeof(a); //变量a
〖运行结果〗: 8
标识符
用来标识变量名、函数名、数组名、类型名、文件名等的字符序列
组成: 只能由字母、数字、下划线组成, 第一个字母必须是字母或下划线(但一般不用下划线)
命名原则: 区分大小写 不能与关键字重复 见名知意,尽量不用下划线开头 避免同名(在同一层次定义的标识符不能同名)
符号常量
定义:用标识符代表常量
定义格式:
#define 标识符 常量值
习惯上,符号常量用大写字母表示,以便与其他标识符相区别。
变量
变量的值在程序执行过程中是可以改变的
为什么要使用变量?
计算机处理的所有数据都必须在内存中,通过定义变量在内存中分配一定(数据类型)字节数的存储单元用来存放数据。
用途:变量通常用来保存程序运行过程中的数据输入、中间结果和最终结果。
注意:C语言中没有字符串变量,在C中它用字符数组来表示。
变量定义(声明)的一般格式:
变量是通过它的名字来使用的,必须先定义后使用
字符数据和整型数据的关系
字符型数据和整型数据之间可以通用:
①字符常量与其对应的ASCII码通用。例:’A’和65
②带符号字符变量和值在-128~127之间的整型变量通用。
③无符号字符变量和值在0~255之间的整型变量通用。
#include <stdio.h>
int main()
{ int i=65; char ch=’A’;
printf("i=%d ch=%c\n",i,ch); /*输出:i=65 ch=A*/
printf("i=%c ch=%d\n",i,ch); /*输出:i=A ch=65*/
i=’A’; /*把字符常量赋给整型变量*/
ch=65; /*把整型常量赋给字符变量*/
printf("i=%d ch=%c\n",i,ch); /*输出:i=65 ch=A*/
printf("i=%c ch=%d\n",i,ch); /*输出:i=A ch=65*/
return 0;
}
格式控制符: %c按字符形式输出一个字符
一个字符数据既可以以字符形式输出,也可以以整数形式输出。
以字符形式输出时,系统先将存储单元中的ASCII码转换成相应字符,然后再输出;
以整数形式输出时,直接将ASCII码作为整型数输出。
char与int数据间可进行算术运算
本质:对字符型数据的ASCII码进行算术运算
#include <stdio.h>
int main()
{ char a = ‘D’,b=‘A’,c;
int d;
c = b+5;
d = a- b+‘b’;
printf(“a=%c,b=%c,c=%c,d=%d\n”,a,b,c,d);
return 0;
}
输出结果:a=D,b=A,c=F,d=101
指针变量
内存中每个字节有一个编号——地址
编译程序根据数据类型为变量分配存储空间
变量的地址:变量分配的存储单元的第一个字节的地址。
char c;
int i=10;
float f=2.2;
指针变量的引用
注意事项:
- 指针变量一定要先赋值再使用,否则不安全,严重时会造成系统瘫痪。
- 不能将普通类型数据(0除外)直接赋给指针变量。例如 int *p=100;/*error*/
- 原因:类型不匹配,不能赋值。 100是整型数据,p是一个指针
- 可以定义空类型的指针变量,空类型的类型标识符为void。
- 例:void *p;
- p为空类型的指针变量,仅表示p指向内存的某个地址位置,而它所指向的内存单元的大小没有指定。
- 若想使用void型的指针变量,必须通过强制类型转换。 例:void *p; (int *)p;
- void *类型通常用作函数的参数或返回值