【C语言基础】:数据类型与类型转换

目录

​编辑

数据类型

概念

内置类型

整数类型(整型)

浮点类型(浮点型)

字符类型(字符型)

布尔类型(_Bool)

类型转换

概念

常规算术转换

赋值过程中的转换

 强制类型转换


请别搞错:计算机处理的是数字而不是符号。我们用对行为的算术化程度来衡量我们的理解力(和控制力)。 

此图为此篇文章的思维导图: 

数据类型

概念

C语言提供了丰富的数据类型来描述生活中的各种数据。

用整数类型来描述整数,用浮点类型来描述小数,用字符类型来描述字符。

所谓“类型”,就是相似的数据所拥有的共同特征,编译器只有知道了数据的类型,才知道怎么操作数据。

下面盘点一下C语言提供的各种数据类型(内置)。

内置类型

整数类型(整型)

                                 有符号整数和无符号整数   

  有符号整数如果为正数或0,那么最左边的位(符号位)为0;如果是负数,则符号位为1。因此,最大的16位整数的二进制表示是0111111111111111,对应的数值是32767(即2^15-1)。最大的32位整数的二进制表示是01111111111111111111111111111111,对应的数值是2147483647(即2^31-1)。不带符号位(最左边的位是数值的一部分)的整数称为无符号整数。最大的16位无符号整数是65535(即2^16-1),而最大的32位无符号的整数是4294967295(即2^32-1)。

  默认情况下,C语言中的整型变量都是有符号的(为signed类型),也就是说最左位保留为符号位。若要告诉编译器变量没有符号位,需要将它声明称unsigned类型。无符号整数主要用于系统编程和底层与机器相关的应用。

  C语言的整数类型有不同的大小。int类型通常为32位。有些程序所需的数很大,无法以int类型存储,所以C语言还提供了长整型(long)。某些时候,为了节省空间,我们会指示编译器以比正常储存小的空间来存储一些数,这样的数称为短整型(short)。

  为了是构造的整数类型正好满足需要,可以指明变量是long类型或short类型、signed类型或unsigned类型,甚至可以把说明符组合起来,有以下六种组合可以产生不同类型:

//短整型
short  //与short signed 一样
unsigned short //无符号的短整型,与short unsigned 一样

//整形
int
unsigned int//无符号的整形

//长整型
long 
unsigned long //无符号的长整型

注意

①说明符的顺序没有什么影响

②长度要求:long>int>short,取值范围:long>=int>=short

图一中 short int 和 int 有相同的取值范围。 

图一:16位机的整数类型

图二中 int 和 long int 有相同的取值范围。

图二:32位机的整数类型

图三:64位机的整数类型

浮点类型(浮点型)

整数类型并不能适用于所有应用。有时候需要变量能储存带小数点的数,或者极大和极小数(科学计数法)。这类数可用浮点(因小数点是"浮动的"而得名)格式进行存储。从语言提供了三种浮点类型,对应三种不同的浮点格式。

  • float:单精度浮点数。
  • double:双精度浮点数。
  • long double:扩展精度浮点数。

double精度对于绝大多程序来说够用了。三种浮点格式没有具体的精度。

字符类型(字符型)

字符类型的值可以根据计算机的不同而不同,因为不同的机器可能会有不同的字符集。

                                                                字符集

  当今最常用的字符集是美国信息交换标准码(ASCII)字符集(附图),它用7位代码表示128个字符。下一篇文章会向大家介绍此表。

char 类型的变量可以用任意单字符赋值:

char ch;

ch = 'a'; //lower-case a
ch = 'A'; //upper-case A
ch = '0'; //zero
ch = ' '; //space

注意:字符常量需要用单引号括起来,而不是双引号。

布尔类型(_Bool)

  C语言原来并没有为布尔值单独设置一个类型,而是使用整数 0 表示假,非零表示真。

C99中也引入了布尔类型,是专门来表示真假的。

布尔类型的使用得包含头文件 <stdbool.h>

布尔类型变量的取值是:truefalse

类型转换

概念

  在执行算数运算时,计算机比C语言的限制更多。为了让计算机执行算术运算,通常要求操作数有相同的大小(即位的数量相同),并且要求存储的方式也相同。计算机也许可以直接将两个16位整数相加,但是不能直接将16位整数和32位整数相加,也不能将16位整数与16位浮点数相加。

  C语言则允许在表达式中混合使用基本类型。在单个表达式中可以组合整数、浮点数,甚至是字符。当然,在这种情况下C编译器可能需要生成一些指令,将某些操作数转换成不同类型,使得硬件可以对表达式进行计算。

例如,如果对16位short型数和32位int型数进行加法操作,那么编译器将安排把16位short型值转换成32位值。如果是int型数据和float型数据进行加法操作,那么编译器将安排把int型值转化为float格式。这个转换过程稍微复杂一些,因为int型值和float型值的存储方式不同。

  因为编译器可以自动处理这些转换而不需要程序员介入,所以这类转换称为隐式转换。C语言还允许程序员使用强制运算符执行显式转换。我们先讨论隐式讨论。

当发生下列情况时会进行隐式转换:

  • 当算术表达式或逻辑表达式中操作数的类型不相同时。(C语言执行常规算术转换)
  • 当赋值运算符右侧表达式的类型和左侧变量的类型不匹配时。
  • 当函数调用中的实参类型与其对应的形参类型不匹配时。
  • 当 return 语句中表达式的类型和函数返回值的类型不匹配时。

这里讨论前两种情况,其他情况之后再进行讨论。

常规算术转换

常规算术转换可用于大多数二元运算符(包括算术运算符、关系运算符和判等运算符)的操作数。

转换策略是把操作数转换成可以安全的适用于两个数值的最小储存字节。为了统一操作数的类型,通常将较小的类型转化为较大的类型来实现(这就是所谓的提升)。最常用的是整值提升,它把字符或短整型转换成int类型。  

  • 任一操作类型是浮点类型的情况。按下顺序进行提升(从左向右):

                 float —— double —— long double

  • 两个操作数类型都不是浮点类型的情况。先对两个操作数进行整值提升,再按下顺序进行提升(从左向右):

                 int —— unsigned int —— long int —— unsigned long int 

下面例子展示常规算术转换的实际执行情况:

char c = 0;
short int s = 0;
int i = 0;
unsigned int u = 0;
long int l = 0;
unsigned long int ul = 0;
float f = 0;
double d = 0;
long double ld = 0;


i = i + c;     // c 被转换成 int 类型
i = i + s;     // s 被转换成 int 类型
u = u + c;     // i 被转换成 unsigned int 类型
l = l + u;     // u 被转换成 long int 类型
ul = ul + l;   // l 被转换成 unsigned long int 类型
f = f + ul;    // ul 被转换成 float 类型
d = d + f;     // f 被转换成 double 类型
ld = ld + d;   // d 被转换成 long double 类型

赋值过程中的转换

如果赋值运算符两侧的类型一样,则直接进行赋值,当赋值运算符两侧的类型不一样时,在赋值时要进行类型转换,转换是由系统自动进行进行的,规则如下:

  • 把浮点型数据赋值给整型变量时,要先进行取整操作(去掉小数部分),然后再赋值给整型变量。假设a为整型变量,执行a = 4.7后,a = 4 。
  • 将整型数据赋值给浮点型变量时,会将整型数据以浮点数的形式赋值给变量。假设b为单/双精度实数,执行 b = 4 后,b = 4.0   会以单/双精度实数形式来存储。
  • 将单精度赋值给双精度变量时,内存变为双精度类型存储大小,数值不变,有效位数扩展到15位,将双精度数据类型赋值给单精度变量时,先将双精度数转换为单精度,即只取6~7位有效数字。应注意双精度数值的大小不能超过单精度型变量的数值范围。
  • 将一个占字节多的整型数据赋给一个占字节少的整型变量时(例如把int 赋值给short),只将其低字节原封不动的赋给变量(即发生截断)。

注意:

  • 在进行赋值时,尽量避免将字节多的数据赋值给字节少的数据,因为赋值后数据可能会出现失真,如果一定要赋值,应当保证赋值后数值不会发生改变,即所赋的值在变量的允许数值范围内。
  • 如果浮点常量被赋值给float型变量,那么建议再浮点常量尾部加上后缀f

                                                  f = 3.14159f;

          如果没有后缀,常量3.14159将是double类型,可能会触发警告消息。

 强制类型转换

【强制转换表达式】:(类型名)表达式

int a = 3.14;
//a是int类型,3.14是double类型,两边的类型不一致,编译器会报警告

为了消除这个警报,我们可以使用强制类型转换:

int a = (int)3.14;
//意思是将3.14强制类型转换为int类型,这种强制转换只取整数部分

俗话说,强扭的瓜不甜,不到万不得已的时候还是不要使用强制类型转换为好。

谢谢各位大佬能看到结尾,还望能留下一个小爱心咯。

最后,祝各位大佬学习愉快~~~

  • 21
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 24
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高乐高有点矮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值