C语言中的数据类型:
char
char:字符类型的名称是char,这个类型里包含256个不同的整数,每个整数都可以代表一个字符(例如’^’,’4’,’v’等等);这些整数和字符是完全可以互相替代的,ASCII码表里列出了所以的整数和字符之间的对应关系。
字符 | 十进制数 |
---|---|
‘A’ | 65 |
‘0’ | 48 |
ASCII码表里所有小写英文字母都是连续排列的,‘a’对应的整数最小,而‘z’对应的整数最大。所以大写英文字母和阿拉伯数字也都符合这个规律。也就是说:’d’ - ‘a’ == ‘D’ - ‘A’,也就是说这些字符是可以计算的,并且数字差还有一定规律。字符类型中的256个字符被分成两组,每组包含128个字符,其中一组字符对应的整数在所有计算机上都一样,它们对应的整数范围从0到127.另一组字符对应的整数在不同的计算机上可能不同,这些整数的范围可能从-128到-1,也可能从128到255.不过我们常用的字符都是前面128个字符。其中有几个需要重点注意的字符:
‘\n’ | 换行 |
---|---|
‘\r’ | 回车 |
‘\’ | 代表字符’\’ |
‘\” | 代表字符单引号‘ |
‘\”’ | 代表字符双引号“ |
short
短整数类型的名称是short。
它里面包含65536个不同的整数,其中一半是非负数,另外一半是负数。这些数字以0为中心向两边扩展。
long
长整数类型名称是long
这个类型里包含2^32个不同的整数,其中一半是负数另一半是非负数。这些数字以0为中心向两边扩展。
int
在我们一般常用的计算机上整数类型和长整数类型完全一样。
以上类型统称为有符号类型
每个有符号类型都有一个对应的无符号类型,无符号类型的名称就是对应的有符号类型名称前面加unsigned(例如unsigned char ,unsigned int 等等)
无符号类型所包含的数字个数和对应的有符号类型一样,无符号类型所包含的数字都是从0开始向正数方向扩展的,无符号类型中不包含负数。
以上数据类型统称为整数相关类型
整数相关类型中包含的整数是可以互相重叠并且逐渐扩大的。
补充:程序中不带小数点的数字后加 u 表示数字的类型是无符号整数类型
浮点类型float
C语言中用浮点类型表示带小数点的数字,浮点类型分为单精度浮点类型和双精度浮点类型,双精度浮点类型可以记录更多小数点后面的数位内容。
单精度浮点类型名称:float;
双精度浮点类型名称:double;
程序中使用带小数点的数字默认是双精度浮点类型。但是如果在带小数点的数字后面加 f 就表示它的类型是单精度浮点类型。
C语言中可以扩展新的数据类型
这些扩展出来的数据类型叫做复合数据类型,这些复合数据类型需要先定义然后才能使用。
布尔类型
布尔类型是C99规范引入的,布尔类型里只包含0和1两个整数,0叫做假,1叫做真。
任何整数都可以当做布尔值来使用,0当做布尔值使用时是假,其他所有整数当做布尔值使用的时候都是真。
程序中一般直接使用整数类型替代布尔类型
数据类型和占位符的对应关系
数据类型 | 占位符 |
---|---|
char / unsigned char | %c |
short | %hd |
unsigned short | %hu |
long | %ld |
unsigned long | %lu |
int | %d |
unsigned int | %u |
float | %f或者%g |
double | %lf或%lg |
%f和%lf会保留小数点后无效的0,%g和%lg不会保留
数据类型与存储字节大小对应关系
不同数据类型的存储区所包含的字节个数不同,sizeof关键字可以用来计算一个存储区里包含的字节个数。
数据类型 | 包含字节个数 |
---|---|
char / unsigned char | 1个字节 |
short | 2个字节 |
unsigned short | 2个字节 |
long | 4个字节 |
unsigned long | 4个字节 |
int | 4个字节 |
unsigned int | 4个字节 |
float | 4个字节 |
double | 8个字节 |
只要能当做数字使用的内容都可以放在sizeof关键字后面的小括号里
最后介绍一个C基本函数scanf
scanf()是C语言中的一个输入函数。与printf函数一样,都被声明在头文件stdio.h里,因此在使用scanf函数时要加上#include
#include <stdio.h>
int main(void)
{
int a,b,c;
printf("Give me the value of a,b,c seperated with whitespaces:\n");
scanf("%d%d%d",&a,&b,&c);
printf("a=%d,b=%d,c=%d\n",a,b,c);
return 0;
}
&a,&b,&c中的&是寻址操作符,&a表示对象a在内存中的地址 ,是一个右值。变量a,b,c的地址是在编译阶段分配的(存储顺序由编译器决定)。
这里注意:如果scanf中%d是连着写的如“%d%d%d”,在输入数据时,数据之间不可以用逗号分隔,只能用空白字符(空格或tab键或者回车键)分隔——“2 (空格)3(tab) 4” 或 “2(tab)3(回车)4”等。若是“%d,%d,%d”,则在输入数据时需要加“,”,如“2,3,4”。
重点
最后要强调的是:
当把占空间大的整数赋值给占空间小的整数相关类型存储区的时候只能保留最后的二进制数位,这会造成数据丢失。
当把占空间小的有符号整数类型数字赋值给占空间大的整数类型相关存储区时扩展出来的数位里全部要填充符号位的内容。