C语言中数据类型大致可分为两类:基础数据类型和复杂数据类型。
基础数据类型,总的来说分为两种:整型和浮点型。
1. 整型数据
顾名思义,整型数据就是指没有小数的数字。如122,-33等。他们都没有小数。
整型数据的类型关键字为int。根据计算机硬件及操作系统的不同,int类型的在内存中占用的空间大小不同。对于现代计算机而言,int类型通常占用4字节,即32位。可以使用sizeof运算符得到当前系统环境下int类型占用的内存数。
unsigned long size = sizeof(int);
printf("int 类型占用 %lu 个字节\n”,size);
程序输出:int类型占用 4 个字节。
但仅有一中长度的整型数据,显然不能满足左右程序的要求,有些程序需要很短的整型,有些程序又需要很长的数据类型,因此就衍生出了整型限定符。
1.1 短整型:short
在某些程序中,只需要很小的整数,因此用4个字节来存储就有点浪费内存了。因此C语言给出了short关键字,用来表示一个短整型数据。如下所示:
short int an = 12;
为了书写方便,通常省略int,而简写成:
short an = 12;
C语言并没有规定短整型在内存中占用多大的空间,而只规定了short占用的内存空间不能多于int类型。
1.2 长整型:long
有些程序需要比较大的整型数据,而int类型不够用,因此C语言给出了long关键字,用来表示一个长整型数据。如下所示:
long int bn = 222433;
为了书写方便,通常省略int,而简写成:
long bn = 222433;
C语言也没有规定long类型在内存中占用多大的空间,而只规定了long占用的内存空间不能少于int。
1.3 长长整型:long long
在C11标准中,提出了更长的整型类型,long long int(通常简写成long long ),它在内存中占用的空间通常比long类型多。因此能表示更大范围的整型数据。
1.4 有/无符号限定符:signed和unsigned
整型数据都是有符号的,其数值可以是正数,也可以是负数。有符号整型,其完整定义如下所示:
signed int si= 12;
signed short ss = 12;
signed long sl = 12;
C语言中,整型数据默认的都是有符号的。因此,对于一个有符号的整型数据,通常不写signed,而只用关键字。如下所示:
int si = -19;
short ss = -19;
long sl = -19;
有些变量永远不可能为负数,因此就可以使用unsigned的关键字,表明变量为无符号的整数。如下所示:
unsigned int uiwrong= -12; (编译器报错:usigned int类型的数值不能为负数)
unsigned int ulright= 334;(编译通过)
有符号和无符号的整数,其在内存中占的空间大小相同,但有符号的整型,其二进制的最高位表示符号,剩下的位数才表示数值,而无符号的整型,其全部位都用来表示数值。
2. 字符型数据:char
C语言中所有字符均使用ASCII码,而ASCII码实际上是将字符映射为一个整数。因此字符型数据,实际上也是整型。
字符型数据在内存中占用1个字节,字面量用一对单引号给出,或直接给出ASCII码,如下所示:
char c = ‘a’;
char d = 97;(97为字符a的ASCII码)。
但是需要注意一点,char类型没有符号,因此不能使用unsigned关键字修饰。
3. 布尔型数据
C语言并没有单独的布尔型数据,当值为0时,则表示“假”,值不为0时则表示“真”。
4. 浮点型数据
C语言提供了三种浮点型数据。需要注意的是,浮点型数据只是近似值,而不是准确的值。
4.1 单精度浮点型:float
float类型在内存中占用4字节,它只能表示6位有效数字,第7位数字准确度无法保证。定义浮点数据,其字面量后面应写上f,如下所示:
float f_value = 3.23f;
4.2 双精度浮点型:double
double类型在内存中占用8字节,它能表示15位的有效数字。其定义如下:
double d_value= 2.394;
5. 类型转换符
在C语言看来,一切数据都为都是数字,其本质就是二进制的0和1。当需要输出某个数据时,就需要将二进制数以指定的格式输出。例如数字65,其二进制数位0100 1010。如果以十进制输出,则输出为65;如果以字符输出,则输出为字母A。因此,在C语言中,输出数据时,必须使用正确的类型转换符。
5.1 整型
int an = 65;
printf(“%d”,an); //%d为int类型的输出类型转换符。
5.2 短整型
short bn = 65;
printf(“%hd”,bn); //%hd为short类型的输出类型转换符;
5.3 长整型
long cn = 65;
printf(“%ld”,cn); //%ld为long类型的输出转换符;
5.4 长长整型
long long dn = 65;
printf(“%lld”,dn); //%lld为long类型的输出转换符;
5.5 无符号
unsigned int an = 13;
printf(“%u",an); //%u为unsigned int类型的输出转换符;
unsigned short bn = 12;
printf(“%hu\n",bn); //%hu为unsigned short类型的输出转换符;
unsigned long cn = 23;
printf(“%lu\n",cn); //%lu为unsigned long类型的输出转换符;
unsigned long long dn = 65;
printf("%llu",dn); //%llu为unsigned long long类型的输出转换符;
5.6 字符型
char en = ‘a’;
printf(“%c”,en); //%c为char类型的输出转换符;
5.7 十六进制输出:
int an = 93;
printf(“%x”,an); //%x表示以十六进制输出整型数据。
printf(“%#x”,an); //%#x表示以十六进制输出整型数据,并输出十六进制的前缀0x;
5.8 八进制输出:
int an = 93;
printf(“%o”,an); //%o表示以八进制输出整型数据;
printf(“%#o”,an); //%#o表示以八进制输出整型数据,并输出八进制的前缀0;
5.9 浮点数输出:
float an = 93.42;
double bn = 6.564;
printf(“%f”,an); //%f表示输出浮点数;
Printf(“%f”,bn);
5.10 %+数字+转换符
这种形式的转换符,数字表示最小字段宽度及小数位。
- 对于整型数据:
int an= 94;
printf(“%6d”,an); //数字6表示,an的数值在屏幕上占用宽度最少为6个字符的宽度;如果容纳不下,则系统会自动加宽空间。
printf(”%6.5d“,an); //数字6表示an的值在屏幕上最少占用的宽度,.5表示an的值最小位数;an的值只有两位,因此,系统会在an的值前面补0,使其占到5位;
- 对于浮点数:
float an = 3.1415926;
printf(“%10f”,an); //数字10表示an值在屏幕上占用的最小宽度;
printf(“%10.2f”,an); //.2表示打印小数点后2位(会执行四舍五入);
5.11 字符串
C语言没有字符串的概念,字符串实际就是一个字符数组,它也可以在printf()函数中一次性输出;
char stringValue[] = "this is raymond's blog.";
printf("%s\n",stringValue); //%s将字符数组以字符串的形式输出;