一、数据类型
C语言常见数据类型如下:
1.数据类型
- 基本数据类型
基本数据类型最主要的特点是,其值不可以再分解为其他类型。
也可以说,基本数据类型是自我说明的。
- 构造数据类型
构造数据类型是根据已定义的一个或多个数据类型用构造的方法来定义的。
也就是说,一个构造类型的值可以分解成若干个“成员”或“元素”。每个“成员”都是一个基本数据类型或一个构造类型。
在C语言中,构造类型有以下几种:
- 数组
- 结构体
- 共用体(联合)类型
- 指针类型
指针是一种特殊的、且具有重要作用的数据类型,其值用来表示某个变量在内存储器中的地址。虽然指针变量的取值类似于整型量,但这是两个类型完全不同的量,因此不能混为一谈。
- 空类型
在调用函数值时,通常应向调用者返回一个函数值,这个返回的函数值是具有一定的数据类型的,应在函数定义及函数说明中给以说明。
例如在上一节例题中给出的max函数定义中,函数头为int max(int a, int b);,其中int类型说明符即表示该函数的返回值为整型量。
但是,也有一类函数,调用后并不需要向调用者返回函数值,这种函数可以定义为“空类型” ,其类型说明符为void。
2.常量和变量
对于基本数据类型量,按其取值是否可改变又分为常量和变量两种。
在程序执行过程中,其值不发生改变的量称为常量,其值可变的量称为变量。
它们可与数据类型结合起来分类,例如,可分为整型常量、整型变量、浮点常量、浮点变量、字符常量、字符变量、枚举常量、枚举变量。
在程序中,常量是可以不经说明而直接引用的,而变量则必项先定义后使用。
整型量包括整型常量、整型变量。
常量和符号变量
在程序执行过程中,其值不发生改变的量称为常量。
符号常量:用标示符代表一个常量。
在C语言中,可以用一个标识符来表示一个常量,称之为符号常量。
符号常量在使用之前必须先定义,其一般形式为:
#define 标识符 常量
其中#define
也是一条预处理命令(预处理命令都以#开头),称为宏定义命令,其功能是把该标识符定义为其后的常量值。一经定义,以后在程序中所有出现该标识符的地方均代之以该常量值。
习惯上符号常量的标识符用大写字母,变量标识符用小写字母,以示区别。
举例如下:
#include <stdio.h> #define PRICE 30 void main() { int num, total; num = 10; total = num * PRICE; printf("total=%d", total); }
打印:
total=300
其中:
#define PRICE 30
用标识符代表一个变量,称为符号变量;
符号常量与变量不同,它的值在其作用域内不能改变,也不能再被赋值。
使用符号常量的好处:
- 含义清楚;
- 能做到”一改全改“。
变量
其值可以改变的量称为变量。一个变量应该有一个名字,在内存中占据一定的存储单元。
变量定义必项放在变量使用之前,一般放在函数体的开头部分。
如下:
int k = 3;
要区分变量名和变量值是两个不同的概念,在上例中,k是变量名,3是变量值。
3.整型数据
整型常量的表示方法
整型常量就是整常数。
在C语言中,使用的整常数有八进制、十六进制和十进制三种:
- 十进制整常数
十进制整常数没有前缀,其数码为0-9。
以下各数是合法的十进制整常数:
237、-568、65535、1627等。 - 八进制整常数
八进制整常数必须以0开头,即以0作为八进制数的前缀,数码取值为0-7。
八进制数通常是无符号数。
以下各数是合法的八进制数:
015(十进制为13)、0101(十进制为65)、0177777(十进制为65535)。 - 十六进制整常数
十六进制整常数的前缀为0X或0x,其数码取值为0-9、A-F或a-f。
以下各数是合法的十六进制整常数:
0X2A(十进制为42)、0XA0 (十进制为160)、0xFFFF (十进制为65535)。
在程序中是根据前缀来区分各种进制数的,在书写常数时不要把前缀弄错造成结果不正确。
整型常数的后缀:
在16位字长的机器上,基本整型的长度也为16位,因此表示的数的范围也是有限定的。十进制无符号整常数的范围为0-65535,有符号数为-32768 - +32767,八进制无符号数的表示范围为0 - 0177777,十六进制无符号数的表示范围为0X0 - 0XFFFF或0x0 - 0xFFFF。
如果使用的数超过了上述范围,就必须用长整型数来表示,长整型数是用后缀 L或l 来表示的。
整型变量
变量定义的一般形式为:
类型说明符 变量名标识符, 变量名标识符, ...;
例如:
int a,b,c; // a,b,c为整型变量 long x,y; // x,y为长整型变量 unsigned p,q; // p,q为无符号整型变量
在书写变量定义时,应注意以下几点:
- 允许在一个类型说明符后,定义多个相同类型的变量,各变量名之间用“,”号间隔,类型说明符与变量名之间至少用一个空格间隔。
- 最后一个变量名之后必须以“;”号结尾。
- 变量定义必须放在变量使用之前。
一般放在函数体的开头部分。
整型数据在内存中的存放形式是二进制,在上例中声明k变量,值为3,以二进制存储示意如下:
补充–内存中的二进制存储:
1字节Byte = 8位bit。
数值是以补码表示的:
- 正数的补码与原码相同;
- 负数的补码
将该数的绝对值的二进制形式按位取反再加1。
举例说明–求-10的补码:
10的原码: 00001010
取反: 11110101
再加1,得到-10的补码: 11110110
可以得到,最高位是符号位,1表示负数,0表示整数。
整型变量的分类:
- 基本型
类型说明符为int,在内存中占4个字节。 - 短整型
类型说明符为short int或short,在内存中占2个字节。 - 长整型
类型说明符为long int或long,在内存中占4个字节。 - 无符号型
类型说明符为unsigned。
注意:
这里占多少个字节跟具体的系统和编译器规定有关。
在本机查看不同类型所占位数测试:
#include <stdio.h> void main() { printf("%d\n", sizeof(int)); printf("%d\n", sizeof(short)); printf("%d\n", sizeof(long)); printf("%d\n", sizeof(unsigned)); }
打印:
4 2 4 4
整型变量信息如下:
整型变量的定义和使用举例如下:
#include <stdio.h> void main() { int a, b, c, d; unsigned u; a = 5; b = -15; u = 12; c = a + u; d = b + u; printf("a+u=%d, b+u=%d\n", c, d); }
打印:
a+u=17, b+u=-3
在编译运行时a、b、c、d与u的数据类型不一样,会自动将无符号型转化为默认类型有符号型再进行计算。
整型数据的溢出举例如下:
#include <stdio.h> void main() { short int a, b; a = 32767; b = a + 1; printf("%d, %d", a, b); }
打印:
32767, -32768
显然,出现了负数-32768。
解释:在本机编译环境中,short int是2个字节16位,216=65536,65536÷2=32768,即short int有符号型的范围是 -32768-32767,而程序中b的值为32768,超出范围即溢出,其二进制为1000000000000000,此时最高位为1表示负数,所以显示了-32768。