目录
前言
本系列的意义在于两点,一则是作为本人(一个编程初学者)的学习笔记记录,二则希望能对后来者提供一些帮助,因为本人也为新手,难免有些错误或讲述不清之处,恳请大家指出或提出建议,本人也会虚心修改。
本系列的目标是帮助一个编程初学者快速拥有简单的编程能力,能够自主完成洛谷入门级和部分普及级题目。
本节提要
本节我将提供介绍几种C语言中的数据类型并简单介绍他们的创建与初始化,他们主要包括字符型,整形家族,浮点型(又称实型)家族
一、几种类型的对比
类型及 其关键字 | 所占大小(单位:字节) | 取值范围 | 输入输出格式符 | 创建样例 | |
字符型 | char (字符型) | 1 | -2^7~2^7-1 | %c | char a='a'; |
整形家族 | int (整形) | 4 | -2^31~2^31-1 | %d | int a=100; |
short int (短整型) (int可省略) | 2 | -2^15~2^15-1 | %hd | short a=100; | |
long int (长整型) (int可省略) | 8 | -2^63 ~ 2^63 -1 | %ld | long a=100; | |
long long int (超长整形) (int可省略) | 8 | -2^63 ~ 2^63 -1 | %lld | long long a=100; | |
浮点型家族 | float (单精度浮点型) | 4 | -3.4E+38 ~ 3.4E+38 | %f | float a=1.0; |
double (双精度浮点型) | 8 | -1.7E+308 ~1.7E+308 | %lf | double a=1.0; | |
long double (长精度浮点类型) | 16 | -1.2E+4932 ~1.2E+4932 | %llf | long double a=1.0; |
补充:计算机中存储单位的大小及转换
bit(比特)
1 byte(字节)=8 bit
1 kb(字节)=1024 byte
1 mb(兆字节)=1024 kb
1 gb(吉字节)=1024 mb
1 tb(吉字节)=1024 gb
1 pb(拍字节)=1024 tb
二、有关这几种类型的补充
1.unsigned
简单来说在以上的关键字(浮点型家族除外)前加上unsigned可使他们变为相应的无符号型,即他们不再能表达负值,其本质是将数字的二进制源码(有关问题将在后面称述)的符号位视为一般位,所以在赋值时我们需注意是否有将有符号型赋值与无符号型(或相反)的情况,以及他们的输入输出格式符(无符号型的,只需将有符号型的中的d换为u即可,如int 的为%d,对应的unsigned int 为%u)
#include<stdio.h>
int main()
{
int n = -100;
unsigned long int res = n;
printf("%ld\n", res);
printf("%lu\n", res);
return 0;
}
经过了上面的阐述,请问上面的程序段打印的结果是否相同呢?
答案是
至于为什么第二个打印的结果为4294967196,这就涉及到二进制源码的问题了,此处我们暂且按下不表,我们将会在之后的内容中学习到它
注:浮点数是不能用 unsigned来规范的。unsigned 的意思就是把内存中的数据第一位也用来表示数据,而不用于表示符号位。而浮点数规定内存中数据的第一位必须是符号位。因此两者之间是互相矛盾的,这也就是为什么浮点数不会有unsigned类型。
2.char
在上面的类型中,我们规定,如果不标明unsigned,那么默认它是一个有符号类型,但char型不一样,char在标准中不指定为signed或unsigned,它具体是有符号型,还是无符号型,将由编译器决定。
3.short,int,long,long double
这里提到的几种类型实际上我们并没有具体规定他所占的空间与大小到底是多少
如:
- short 规定至少占用 2 个字节。
- int 建议为一个机器字长。32 位环境下机器字长为 4 字节,64 位环境下机器字长为 8 字节。
- 规定short 的长度不能大于 int,long 的长度不能小于 int
这就意味着,short 并不一定真的”短“,long 也并不一定真的”长“,它们有可能和 int 占用相同的字节数。也就是说他们的大小及数据范围将由操作系统和编译器决定,而并非是一个具体值,如果我们想知道在当前机器和编译器下,他们的大小和数据范围,我们可以利用 sizeof 关键字去进行测算。
三、有关变量创建及赋值的一些问题
1.变量创建的格式
我们创建变量时使用如下格式 变量类型 变量名,并且为了保险起见,我们一般在定义时就会对变量进行初始化,如 float F=1.99; 这里我们定义了一个float类型的名字为F,值为1.99的变量。当然,如果有需要,我们也可不对变量进行初始化,如 float F;
2.变量名
定义变量时,变量名可以随我们心意地命名(只要不与C语言中的关键字重名),但必须是字母(字母区分大小写)、数字和下划线的组合。同时变量名的开头不能是数字,可以由字母或下划线开头。但是为了更规范,更通用的命名,一般来说我们会尽量遵守以下的规则(但并非是强制要求)
- 随便打开一个头文件就会看到,它里面的变量名、宏名、函数名大多是以下划线开始的。所以为了避免与系统定义的名字产生冲突,在编程的时候,除非要求这么定义,否则尽量都不要使用下划线作为一个变量名的开头。
- 最好采用英文单词或其组合,不要使用拼音。同时程序中的英文单词一般不要太复杂,用词应当准确。
-
C 是一种简洁的语言, 命名也应该是简洁的。例如变量名MaxVal 就比MaxValueUntilOverflow 好用。标识符的长度一般不要过长,较长的单词可通过去掉“元音”形成缩写。
3.变量类型
变量分为全局变量(定义在{ }外部,对全局生效的变量)和局部变量(定义在{ }内部,对该{ }内生效的变量),当局部变量和全局变量名字冲突时,遵循局部优先,但不建议写成一样的
注1:当全局变量不进行初始化时,我们规定它为0,而局部变量不进行初始化时,我们会赋予其一个随机值
注2:同一工程下的全局变量可跨源文件使用,但使用时需用extern声明
4.常变量
1.const
使用const修饰的变量,将变为一个常变量(但它仍是一个变量),使其在全局生效,并且不可被再次修改。常用于:1.定义一个常用常数为全局变量,便于之后程序的修改(可以一次修改所有使用了这个常数的地方,而无需一处一处的寻找和修改);2.对循环内部定义的局部变量,使其在每一次循环时,都能接着上次循环而改变(其实这个也不常用(笑))
如:const int a=1e5+10;
2.define
用define定义的常变量类似于定义某值为全局常变量(当然也可定义于大括号内,作为局部变量)
如:#define a=10;
5.不同类型的互相赋值问题
我们当然可以把不同类型的变量互相赋值,也可以使用不同的输出格式符打印,正如上面我把int 赋与unsigned long int 类型,并使用了不同的输入输出格式符打印一样,但需要注意精度问题
#include<stdio.h>
int main()
{
float a = -100.9;
int b = a;
unsigned c = -b;
printf("%d\n", b);
printf("%u\n", c);
return 0;
}
我们来猜测一下上面这个代码段输出的答案到底是多少呢?
答案是
你做对了吗?如果对了,那证明你已经基本理解了这里的内容了,如果没有,没关系下面我们一起来看看吧
首先,我们定义了float型的变量a为-100.9,然后我们将其赋值与int类型的b,因为计算机为向下取整,所以b被赋值为-100
然后我们将b赋值与unsigned int 类型的c,所以它以该类型打印出来,就为-100的绝对值,即为100
三、推荐练习
洛谷:这一节中我们讲述的内容偏向理论,本人没有想到没有什么特别适合新手尝试的题目,故而我提供一个编程作业思路给大家,请大家编程创建多个不同类型的变量,然后将他们互相赋值并输出,熟悉不同类型间的区别
四、下节预告
下一节中,我将会向大家介绍C语言中的转义字符是什么,并讲解常用的几种转义字符。