我理解的C语言 #3:基本数据类型与类型转换

本文介绍了C语言的基本数据类型,包括整型、浮点型和字符型,详细阐述了变量声明、初始化及ASCII码的概念。同时,讨论了类型转换,如自动类型转换和赋值转换,强调了在不同操作中数据类型的处理规则。
摘要由CSDN通过智能技术生成

基本数据类型总览:

基本数据类型关键字变量声明实例所占内存(单位:字节)
基本整型intint a;4
长整型longlong int a; / long a;4
长长整型long longlong long int a; / long long a;8
短整型shortshort int a; / short a;2
无符号整型unsignedunsigned int a; / unsigned long b; / unsigned short c;与unsigned后的类型一致
单精度浮点型(实型)floatfloat a;4
双精度浮点型(实型)doubledouble a;8
长双精度浮点型(实型)long doublelong double a;16
字符型charchar a;1

需要注意的是,同一种数据类型所占内存大小并没有一个统一的标准,不同的编译器可能会有些许差别(当然基本上是一致的),因此出现int和long类型所占内存大小一样的情况,以上数据均来自编译器Dev C++。如果我们需要确切了解我们所用编译器各种数据类型的所占内存大小,可以通过之前提到的sizeof关键字进行查看。代码如下:

int a;
printf("   %d",sizeof(int));
printf("   %d",sizeof a);

sizeof(int)是一个表达式,它的值是一个无符号整型,代表所占的字节数。sizeof的对象像上面展示的一样,可以是一种数据类型,也可以是个变量名。如果对象是数据类型的话必须将其用圆括号括起来。

既然每种数据类型所占的内存都不是无限大的,那所能储存的信息必然是有限的。每种数据类型所能储存数据的大小究竟是怎么确定的,碍于篇幅,不在这里详细讲。会在后面的二进制知识补充中展开。对于新手入门C语言来说,int和float在学习和一般题目中已经够用了。

整型:

  • 基本整型int:

    1.声明int类型:

    ​ 关于需要声明的原因,在本系列的第一篇中已经进行了说明,这里不再赘述。在我们声明变量时,通用格式 为:关键字 + 变量名。

    int a;
    

    ​ 当然,我们也可以选择一次性声明多个变量。

    int a,b,c;
    
    2.初始化变量:

    ​ 初始化就是为变量赋一个初始值。我们可以在声明变量后,使用单独的赋值语句完成初始化,整型,就意味着该变量的值为一个整数。

    a = 1;
    

    ​ 也可以在声明变量时就进行初始化。

    int a=1,b=2;
    

    ​ 但要注意下面的做法是错误的,会在编译阶段报错。

    int a = b = 1;
    

    ​ 尽管在大多数情况下,我们在后续的代码中,都会有赋值语句将初始值覆盖掉,但我们一般仍会在声明一个变量之后进行初始化,这是一个良好的编程习惯。当变量没有初始化时,所代表的值是一个不确定的随机值,如果这时我们使用它进行运算,很容易出现无法预估的错误。

    3.int类型的计算:

    我们在上一篇文章中提到了,C语言中用(/)来作为除号。在计算过程中,两个整型得到的结果也只能是一个整型。因此,在对两个整数使用(/)时,得到的是最终结果的整数部分。

    int n=10 , m = 4 , s;
    s = n / m;
    

    这里s=2,而不是2.5,计算机不会进行四舍五入,而是在计算出整数部分后停止计算,即不论实际上小数点 后面有多少位,都会直接舍弃。那我们怎样才能得到2.5的答案呢,我们可以通过待会要讲的强制类型转换解决。

    4.其他整型:

    其他的长整型、短整型等整型与上面的基本整型只有数据范围上的区别,在声明、初始化和计算方法上是一致的,不再赘述。需要注意的是,无符号整型只能表示正数,而其他均可储存正数和负数,其中的原因在讲解二进制时在细说。

浮点型(实型):

  • 单精度浮点型(实型)float:

    1.声明float类型:

    ​ 方法与int类型的声明一致

    float a;
    float a,b;
    
    2.初始化变量:

    ​ 浮点型(实型)代表的值就是我们数学中所说的小数。初始化的方法和要注意的地方也与int一致。

    a = 1.0;
    float a = 1.0,b = 2.5;
    
    3.浮点型(实型)的精度问题:

    ​ 在我们下面会讲到的格式化输出中,float只能输出小数点后六位。这并不代表float类型只能储存到小数点后六位,而是只能显示后六位,这两者之间是有区别的,对于第六位之后的数据,会进行四舍五入的处理。

    flaot a = 2.0000007

    ​ 如果我们使用printf()函数进行输出,得到的会是2.000001,当这个精度无法满足我们的需求时,我们就要改用double或精度更高的数据类型。

字符型:

1.声明char类型:

与其他类型声明方法一致。

char a;
char n.m;
2.初始化变量:

字符型顾名思义,对应的值是一个字符,因此我们在赋值时需要用单引号括起来。

a = 'A';
char n = 'x';

注意,每个char类型变量只能存储一个字符,多个字符组成且用双引号括起来的叫做字符串,不在这篇文章的讨论范围内。

3.ASCII(美国信息交换标准代码):

​前面的文章中已经提到,计算机只能存储二进制的信息,那字符型存储的各种字符在计算机中也只能是数字。一个字符型变量所占空间为一个字节,即8位二进制数,总共可以表示256种(2的8次方)情况。我们可以指定一个数字,代表一个特定的字符,这样就能存储256种字符。那我们怎么知道哪个数字对应哪个字符呢,这就需要一个统一的标准。C语言采用的是ASCII标准,对应的数字我们叫做ASCII码,这个标准的具体内容限于篇幅,读者可以点击下方连接,查看标准表的内容。

ASCII百度百科

我们可以发现,除了字母以外,还有数字字符,比如48代表字符’0’,这个表不要求完全记下来,但我们应该对 一些常用的字符的ASCII码有所印象。字符’0’的ASCII码为48,'1’就为49,依次往后。字符’A’的ASCII码为65,其它大写字母依次往后,字符’a’的ASCII码为97,其它小写字母依次往后。

既然字符在计算机内的本质是数字,那么有些脑洞比较大的读者也许会想,字符是不是也可以进行运算呢,答案是肯定的,但前提是运算的结果仍在char类型的存储范围内。

char a = 'A';
a += 1;		//这是变量a的值为'B'

类型转换:

我们前面提到,两个操作数进行运算后得到的结果与操作数的类型一致,但如果两个操作数的类型不一致会出现什么情况呢?

  • 自动类型转换:

    算数转换:

    在对两种不同类型的操作数进行运算时,C语言会有一套规则进行自动类型转换。简单来说,会将取值范围较小的数据类型自动转换为取值范围较大的数据类型,以此来保证数据的准确性,也叫做类型提升。具体转换过程如下图所示。

在这里插入图片描述

赋值转换:

但在进行赋值操作时,进行的是类型下降。原因其实不难理解,因为我们声明变量时就已经确定了这个变量所占的内存,因此我们赋值的时候就不能超过这个范围。举个例子

int a;
a = 2.6;

此时a=2,小数点后的数据会被直接舍弃,不会进行四舍五入的判断。

  • 强制类型转换:

    除了上面提到的编译器编译时进行的类型转换,我们还可以按照自己的想法进行类型转换。具体的方法也很简单。

    int n = 10,m = 4;
    float s;
    s = (float)n / m;
    

    这里我们通过在想要转换的变量面前加上想要转换成的变量类型,并用圆括号括起来,这样在运算时,n被当作float处理(但n实际上还是int类型)。这时的表达式就有两种不同类型的操作数,通过上面的自动类型转化就可以得到我们想要的结果。

(注:未经允许不得转载)

我理解的C语言 #6:选择控制结构与goto语句
我理解的C语言 #5:循环控制结构
我理解的C语言 #4:格式化输入与输出
我理解的C语言 #2:运算符、表达式和语句
我理解的C语言 #1:常量与变量以及命名
我理解的C语言 #0:第一个程序——hello world

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值