2.4.5 字符变量 您所在的位置:网站首页 c语言中char所占的字节数 2.4.5 字符变量

2.4.5 字符变量

2023-04-22 03:14| 来源: 网络整理| 查看: 265

2.4 变量

变量可分为整型变量、实型变量、字符型变量等。整型变量按照有无符号可分为有符号整型(signed)和无符号整型(unsigned)两类。按照所表达的数值范围和占内存字节数可分为短整型(short int)、基本整型(int)和长整型(long),某些系统还支持长长整型(long long)。同时,各类型又分为有符号和无符号两类。实型变量主要有两种形式:单精度浮点型(float)和双精度浮点型(double)。

2.4.1 变量与内存结构

对于整型变量而言,通常的操作系统默认都是有符号类型,如果定义无符号类型,需在前面加unsigned。

1. 计算机操作系统位长

计算机的内存结构是以字节为单位进行信息存储的。每个字节都有一个唯一的数字标识,通常将这个标识称为地址或物理地址。地址有长有短,从1字节到8字节不等。计算机操作系统按照内存地址的长度可分为8位机、16位机、32位机以及64位机等。

8位机指内存地址为1字节数,地址值通常使用十六进制数表示,如0xFB,0x12等。通常较简单的单片机采用8位地址方式,称为8位机。

目前最常用的是32位机,即地址长度为32位,共4字节。例如:0x0012ff65,0x001B56FF。32位机的取址范围为0x00000000~0xFFFFFFFF,共4 GB内存。通常C语言中会使用其中一部分。如无特别说明,本书程序全部基于32位机。

2. 32位机计算机操作系统

32位机中,短整型(short)在内存中占2字节,基本整型(int)在内存中占4字节,长整型(long)在内存中占4字节等。64位机中还有长长整型(long long),在内存中占8字节。单精度浮点型(float)在内存中占8字节,双精度浮点型(double)在内存中占16字节。字符型变量可分为有符号和无符号两种类型:有符号字符型(char)和无符号字符型(unsigned char),两者在内存均占1字节。如表2-4所示为不同类型变量在内存中所占字节数。

表2-4 数据类型内存字节分配表

C语言中可通过运算符sizeof获取数据类型所占的内存字节数。

范例2.15 MemoryTypeByte.c

MemoryTypeByte.c使用运算符sizeof获取不同数据类型在内存中所占的字节数,然后输出打印,由此可以直观地显示各种数据类型所占的内存字节数。(光盘\chat2\MemoryTypeByte.c)

01 #include 02 main() 03 { 04 printf("%d %d %d\n",sizeof(short),sizeof(int),sizeof(long)); //格式输出 05 printf("%d %d\n",sizeof(float),sizeof(double)); //输出float,double型内存字节数 06 printf("%d",sizeof(char)); //输出char型内存字节数 07 }

程序中第4、5和6行分别使用了sizeof运算符,用于获取对象在内存中所占的字节数,对象可以是变量、常量、指针、结构体等,后续章节将对该函数的应用做详细介绍。执行上述代码,输出结果为:

2 4 4 4 16 1 2.4.2 变量的定义

C语言规定,变量必须先定义后使用,未经定义的变量在使用时会提示错误而导致程序编译无法通过。合理定义和利用变量,可以提高程序的执行效率。

1. 怎样定义变量

变量在使用前需要先定义,其定义的一般形式有如下两种。

类型说明符 变量名;

类型说明符 变量名表列;

类型说明符是指要定义的变量类型,例如整型变量的类型说明符为int、short或long等。如定义整型变量i,j,k可以这样定义:

int i; int j; int k;

C语言中,这种表达叫做语句,分别表示定义三个int型的变量i,j,k。语句是C语言中的基本程序结构,并且必须以;作为语句的结束符,分号不可省略。

也可以将定义放在同一个语句中:

int i,j,k;

变量名也称为用户标识符,变量名的定义应遵循一定的规则。

(1)由字母、数字和下画线组成。

(2)变量名不能和关键字相同。

(3)第一个字符必须是字母或下画线。

关键字是由C语言规定的具有特定意义的字符串,通常也称为保留字。用户定义的变量等标识符不应与关键字相同。C语言的关键字主要分为类型说明关键字和流程控制关键字两类。如表2-5所示为关键字表。

对每个关键字的详细说明,请参看附录B,本书将在后续章节中依次讲解每个关键字的作用和用法。注意,最新的C语言语法版本中,将bool也列为关键字之一。

用户定义的变量名(用户标识符)不得与关键字相同,同时必须满足上述的另外两个条件,如下列变量名均是非法的变量名:3i,int,[email protected],_myname!,bool等。

表2-5 关键字表

2. 变量赋初值

在变量定义的同时,还可以进行赋值操作,称作变量赋初值。如下定义:

int i=10; int a=0;

像这种在定义变量的同时并赋予其一定值的操作称为变量赋初值。等价于下面语句:

int i; int a; i = 10; a = 0;

当在一条语句中定义多个变量时,可以使用逗号表达式作如下定义。

int i=10,j=100,k=1000;

关于逗号表达式的概念将在第3章中予以介绍,需要注意的是,不能使用如下方法给不同变量赋相同的值。

int i=j=k=0;

但可以在定义之后进行赋值操作,如:

int i,j,k; i = j = k = 0;

此外,对于单个变量的赋值,可以在定义时进行,也可以在定义之后进行。

2.4.3 整型变量

前面已经讲过,整型变量按照在内存中所占的字节长度分为:短整型(short)、基本整型(int)、长整型(long)等。其中short、int和long称为类型说明符。C语言系统通过这些关键字判断不同类型的变量,从而为其分配相应的内存空间。

范例2.16 IntegerVariableDefine.c

IntegerVariableDefine.c分别定义short、int和long型的整型变量,打印输出各个变量的值,并输出各种整型变量在内存中所占的字节数。(光盘\chat2\ IntegerVariableDefine.c)

01 #include 02 main() 03 { 04 short i=10; //定义short型变量i 05 int j=10; //定义int型变量j 06 long k=10; //定义long型变量k 07 printf("%4d %4d %4d\n",i,j,k); //输出i,j,k的值 08 printf("%4d %4d %4d\n",sizeof(i),sizeof(j),sizeof(k)); 09 }

程序第4、5和6行分别定义三种类型的变量i,j和k并赋初值。程序第7行输出三个参数的值,第8行分别输出三个参数的内存长度。程序运行输出结果为:

10 10 10 2 4 4

虽然变量i,j,k的值相同,但它们在内存中的存储结构却不尽相同,如图2-3所示为不同类型变量在内存中的结构示意图。

需要注意的是,在内存中,数值以二进制形式存放,并以十六进制形式显示,所以,对于十进制数10,在内存中会以十六进制0a显示。

注意,变量在使用前应先定义,若未定义就使用某变量,程序编译时将出现错误,若去掉程序第4行,在编译时将出现如下错误。

图2-3 不同类型变量内存结构

D:\chapt2\shang\ IntegerVariableDefine.c(6) : error C2065: 'i' : undeclared identifier

错误原因是使用了未定义的标识符i。因此,在使用变量前一定记住先定义该变量,这是程序初学者经常犯的错误。

变量在使用前除了先定义,还要赋初值。赋值方式可以先定义后赋值,也可以在定义的同时赋初值。若使用了未经赋值的变量,则将出现不可预期的结果。

范例2.17 InitialVariable.c

InitialVariable.c定义整型变量i、j和k,未给变量i赋值便使用该变量,输出i、j和k的值,检查使用未赋值变量的输出结果。(光盘\chat2\ InitialVariable.c)

01 #include 02 main() 03 { 04 short i; //定义short型变量i 05 int j=10; //定义int型变量j 06 long k=10; //定义long型变量k 07 printf("%4d %4d %4d %4d\n",i,j,k,i+j+k); //输出i,j,k的值 08 }

程序第7行最后一个输出格式输出控制表达式i+j+k,用以验证未赋值参数参与运算后的输出结果。程序输出结果为:

-13108 10 10 -13088

程序输出了无法预料的结果-13108和-13088,这是由于变量i未经赋值便进行了引用。通常称这种不确定值为垃圾值。为避免这类垃圾值影响程序正确结果,一般在变量定义时赋初值0,如无特别说明,本书后续章节都将遵循这一约定。

2.4.4 实型变量

实型变量分为单精度型(float)和双精度型(double)两类。单精度型变量占4个字节,精确位数为7位有效数字。双精度型变量占8个字节,精确位数为16位有效数字。实型变量的定义和整型变量类似,如:

float p1,p2,p3; double x1,x2,x3;

分别表示定义单精度型变量p1, p2, p3和双精度型变量x1, x2, x3。

范例2.18 RealTypeVariable.c

RealTypeVariable.c分别定义float和double型的变量,为两变量赋相同的值,并打印输出,检查两者输出值的差别。(光盘\chat2\ RealTypeVariable.c)

01 #include 02 main() 03 { 04 float i; //定义float型变量i 05 double j; //定义double型变量j 06 i=3.14159265358979323846; 07 j=3.14159265358979323846; 08 printf("i=%.10f j=%.10f\n",i,j);//输出i,j,k的值 09 }

程序第4行和第5行分别定义了float型和double型变量i和j,程序第6行和第7行分别对这两个变量赋初值以验证不同类型的精度。程序运行输出结果为:

i=3.1415927410 j=3.1415926536

程序第8行输出语句中%.10f格式为输出小数点后10位数字。导致出现不同结果的原因是float型和double型的精确度不同。

实型变量在内存中的数据存储格式包括符号位、指数位和尾数三部分。符号位表示数字的正负,指数位表示数字的指数大小,尾数部分表示小数点后能够精确的位数。如图2-4所示为float型和double型变量在内存中的存储结构。

图2-4中(a)图表示float型变量在内存中的存储结构,最高位为符号位,前23位(第0到第22位)为尾数位,中间8位(第22到第30位)为指数位。(b)图表示double型变量在内存中的存储结构,最高位为符号位,前52位(第0到第51位)为尾数位,中间11位(第52到第62位)为指数位。

图2-4 float型和double型变量存储结构

需要说明的是,在计算机中数据以二进制形式存储,因此上述各位值同样以二进制形式存储在计算机中,并且以规范化的指数形式存放。float型中,23位二进制值可表示十进制小数部分7位;double型中,52位二进制小数可表示十进制小数部分16位。

因此,范例2.18中,float型只能精确到小数点后7位,其中第7位采用四舍五入,而double型则能精确到小数点后16位,因此能够准确输出所表达数据。

2.4.5 字符变量

字符变量在内存中占1个字节,类型说明符为char。与整型变量和实型变量的定义类似,字符型变量的定义格式为:

char a;

表示定义了一个字符变量a,变量a可以被赋予任何字符常量和整型值。由于字符变量只占用1个字节,因此只能存放1个字符数据。在内存空间中,字符是以ASCII码值存放的,例如字符'a'在内存中存放的是其ASCII码值97。正因为字符在内存中的这种存储模式,通常也把字符变量当作取值在0~127之间的整型量看待,并且字符变量也可以参与算术运算。

范例2.19 CharacterVariableCalc.c

CharacterVariableCalc.c分别定义整型和字符型变量,以整型和字符型打印输出,检查输出结果。(光盘\chat2\ CharacterVariableCalc.c)

01 #include 02 main() 03 { 04 char c='A'; //定义char型变量c 05 int i=32; //定义int型变量i 06 printf("c=%d i=%d\n",c,i); 07 printf("c=%c i+c=%c\n",c,i+c); 08 }

程序第4行和第5行分别定义了char型和int型变量c和i,程序第6行和第7行分别按不同的输出格式输出这两个变量,以验证两种数据类型的通用性。程序运行输出结果为:

c=65 i=32 c=A i+c=a

因为在ASCII码表中,大写字母A是65,小写字母a是97,两者相差32,程序正是利用这一规律实现了使用算术运算进行大小写字母转换。这一方法在工程应用中被广泛采用。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有