【黑马程序员】 我的C语言学习笔记(1)数据类型

来源:互联网 发布:单片机汇编语言基础 编辑:程序博客网 时间:2024/05/29 09:15

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

程序离不开数据,程序归根结低是对数据的处理。C语言中的数据类型总得来说有两大系列:整数类型和浮点类型。而C语言中为了进行进一步的处理,基于这两大类又细分了多种数据类型。

C语言中的基本数据类型有整形、字符型、实型(浮点型):单精度型、双精度型; 枚举类型。

1、整形

整形分为整形常量和整形变量,常量就是我们平时所看到的准确的数字,例如:1、20、333、、、等等,变量则按我的理解是我像内存去申请一个存储空间,告诉内存空间我申请了这个地方用来存放一个整形的数据,但是什么时候放并没有直接确定。在C语言中基本的整形变量标识符是int,在32位机器中一个int型数据使用32位也就是4个字节进行存储。例如:

<span style="font-size:14px;">
#include <stdio.h>int main(){int age;printf ("Please input a int number: ");scanf ("%d", &age);printf ("%d", age);return 0;}
</span>
上述代码的运行结果截图为:


  如代码所示我们定义了一个int型的变量age,然后提示输入一个age值,再将age打印出来。我们从程序源头开始分析:我们需要一个整形的变量来存储我们的数据,所以我们使用语法: 数据类型  变量名 来定义了一个名为age的整形变量。而编辑器对于这句话的解读是我需要在内存的栈区开辟一个占用4个字节的存储区,这四个存储区将用来存储一个整形的数据。age这个变量名只是给我们看的,内存并不知道age是什么,内存只会记录分配的这4个字节的首地址。然后我们使用printf函数打印一串提示字符,紧接着我们使用scanf函数从键盘读取一个整形数据。关于scanf函数我们不作深入讨论,我们只关注%d和&age。%d是我们常说的格式说明符,为什么需要格式说明符,当我们告诉编译器我们需要读入一个数据时,编译器并不知道该以多少字节或以何种格式去存储这个值。所以我们使用格式说明符就是为了告诉编译器我们需要用存储整形的方式存储这个数据,这个数据占用4个字节的存储空间。而&age则是为了告诉编译器将数据存储在哪,&age得到的是age变量的4个存储空间的首地址,编译器在使用scanf读入数据12时将会把12存储到以&age指明的首地址在内的4个字节的存储空间里。而12在这四个字节中将会怎么存储呢,任何类型的数据在计算机的内存中都以2进制的形式进行存储。至于各种纷繁复杂的数据表现形式,整数、小数等等都只是我们读取的规则不同而已。12以4个字节也就是32位进行存储时应为:0000 0000 0000 0000 0000 0000 0000 1100,因为这里12为正数,所以最高位为0,若是-12其在内存中的存储形式为:1111 1111 1111 1111 1111 1111 1111 0011。而这种正负数的存储方式也是我们约定的一种规则而已,数据的千变万化归根结底还是我们在基础的二进制数据上的各种附加规则的作用结果。

 补充:在C语言中我们会看到unsigned、long、short,这是在C语言中为了扩充不同的需求而采用的类型修饰符,对于这些也不过是对于数据更加严格的限定而已。而对于这些限定,也必须有对应的格式说明符去告诉编译器该如何去读取数据,而究其本质与我们的测试程序并没有任何不同。


2、字符型

 字符型在其本质上就是整形,我们在C语言中使用char表示一个字符型,他占用一个字符的存储空间,字符型在存储时其内部存储的依旧是二进制数据,当我们读出时将会得到一个整形数据,而我们输出时会得到一个字符是因为我们人为的定义了一个对照表,这个表规定字符a的数值就是97,所以当我们遇到97时我们有两种读出方式,第一种以整数形式读出就是97,另一种就是以字符型读出,使用%c指定读出形式,则对照表则为a。如下代码:

#include <stdio.h>int main(){    char ch = 97;    printf("%d %c\n", ch, ch); return 0;}
运行结果:



3、实型

 除了整形还有另一类很重要的基本数据类型,那就是实型。我们在学习数学时不仅使用整数,更多的时候则是使用小数,那么浮点数在内存中饭的存储与整数在内存中的存储有什么不一样的地方吗?其实,单从数据存储上看,都是2进制并没有任何不同,但不同的是我们加在其上的表示规则与读取规则。无论单精度还是双精度的浮点数在内存中我们对于一个浮点数都分为三个部分:1、符号位:0代表正 1代表负; 2、指数位:用于存储科学技术法中的指数; 3、尾数位:存储尾数部分 

3.1 单精度

我们在C语言中使用一个float类型表示一个单精度的浮点类型,一个float类型占用4个字节的存储位,其中最高位为符号位,紧接着8位为指数位,剩下的23位为尾数位,我们使用%f作为其格式说明符,而且float一般精确到小数位后6位,即保证6位有效。

3.2 双精度

 我们在C语言中使用一个double类型表示一个双精度的浮点类型,一个double类型占用8个字节的存储位, 最高位为符号位,紧接着8位为指数位,剩下的52位为尾数位,我们使用%lf作为其格式说明符,而且double类型一般精确到小数位后12位,即保证12位有效


如下代码:

#include <stdio.h>int main(){    double d;    float  f;    scanf ("%f %lf", &f, &d);    printf("f = %f, d = %lf\n", f, d); return 0;}
运行结果:






0 0