c++ cstring 转换 char_C语言中的类型转换

类型转换

  这一章中,我们来讨论一下,有关类型转换的话题。

  我们已经学习了C语言中的,整型数据类型,short、int、long、long long。浮点数据类型,float,double。字符型数据类型,char。事实上,char也是一种整型数据类型,只是取值范围用来装ASCII内的字符与数值映射刚刚好。关键取决于,你用整型的方式%d,还是用字符的方式%c,使用和解释它。另外,还包括上面所有数据类型的无符号版本,加上前缀unsigned。

  在日常使用过程中,我们肯定会遇到这些类型相互转化的一个问题。这一节当中,我们来讨论这些类型的相互转化问题。

1. 判断数据类型的小技巧

  在开始之前,先介绍一个小技巧,用于判断某一个数据对象的类型。

#include 

  首先,我们定义一个整型指针变量p。注意,这里的int后面加了一个*,说明它是一个整型指针变量。我们先不管什么是指针变量,大家只要知道,指针变量和整型、浮点这些数据型的类型是不能相互赋值的。

  由于它们是无法相互赋值的,所以,编译器会提示报错信息出来。

1e9c9c1ede2a9ca270043f7d4293bf9e.png

  从上到下,依次是=无法将char、short、int、long、float、double转化为整型指针变量int *。 提示与我们定义的变量类型一致,说明这个提示是准确的。好的,那下面我们来研究一下,类型与类型之间,进行运算到底会发生什么样的变化呢?

2.同类型之间进行运算

#include 

526bdae2fe14126b4f4f0864ec0a8217.png

  c + c,char同类型运算,结果是一个int类型。

  s + s,short同类型运算,结果是一个int类型。

  n + n,int同类型运算,结果是一个int类型。

  l + l,long同类型运算,结果是一个long类型。

  f + f,float同类型运算,结果是一个float类型。

  d + d,double同类型运算,结果是一个double类型。

  同类型运算中:

整型:比int小的,都会转换成int,比int大的不变。

浮点:不变。

3.不类型之间进行运算

#include 

77fcfb95c69b7bab3ab3241501726b98.png

  c + s,char类型与short类型运算,结果是一个int类型。

  c + n,char类型与int类型运算,结果是一个int类型。

  c + l,char类型与long类型运算,结果是一个long类型。

  c + f,char类型与float类型运算,结果是一个float类型。

  c + d,char类型与double类型运算,结果是一个double类型。

  不同类型运算中:

如果两边均比int小或等于int,那么结果为int。如果两边有比int大的,那么结果为比int大的类型。

char < short < int < long < float < double

  事实上,这个结论也适用于,同类型之间的运算。

4. 自动类型转换

  刚刚上面的代码,让我们看到了类型经过运算后,结果的变化。那么造成这种变化的原因是什么呢?这个原因,我们称之为自动类型转换。C语言会将运算符两边的类型,先经过自动类型转换后,再进行运算。那么为什么有时候转换为int,有时候又是long,有时候是float,又有时候是double了呢?

转换基准:运算符两边若均为比int小的类型,则转换为int。否则转换为运算符两边较大的类型。转换标准依次为int,long,float,double。

  下面举几个例子:

0efabe0063b582924242643d6bb36826.png

  short与char进行运算。两边没有比int大的,基准为int。 short与char均比int小。均转换为int后,再进行运算。运算结果为int。

eab5be5664efea8234be2866c6e9463e.png

  short与int进行运算,两边没有比int大的,基准为int。 左边short比int小,转换为int。右边的int类型不变。运算结果为int。

db102834f655090f151cfcc8afc58e75.png

  short与long进行运算,运算符两边较大的类型为long,long比int大,应当以long为基准。 左边short比long小,转换为long。右边long类型不变。运算结果为long。

ee49b83645fd0c1bc7884ea40684d9d6.png

  int与long进行运算,运算符两边较大的类型为long,long比int大,应当以long为基准。 左边int比long小,转换为long。右边long类型不变。运算结果为long。

1e2c46b2c679dbc20573997204940183.png

  float与int进行运算,运算符两边较大的类型为float,float比int大,应当以float为基准。 左边类型不变。右边int变为float。运算结果为long。

d229565fd2f4ca2d75b472c6b74c3935.png

  double与int进行运算,运算符两边较大的类型为double,double比int大,应当以double为基准。 左边类型不变。右边int变为double。运算结果为double。

afb79a09fc636c1fe13a981771094949.png

  doulbe与float进行运算,运算符两边较大的类型为double,double比int大,应当以double为基准。 左边类型不变。右边float变为double。运算结果为double。

  是不是按照这个规律,就可以解释为什么运算过后,类型发生变化的原因了呢。快去试试看吧。

5. 整型运算符的注意点

  整型与整型运算,是不会出现浮点类型的。也就是说,你将丢失小数点。

c1e333af32106f232001e1fbd0db51c8.png

  那这好办,我们把%d换成%f行不行呢?

ece60dc01a6a5131baebd99667fecd8c.png

  显然,还是不行的,除号运算符两边均为int,int与int运算,结果是int。用%f来打印int是错误的。那我们必须在运算符两边,设置一个浮点型才行,float和double都可以。根据上面的转换规则,运算符两边均会转换为浮点型进行运算,结果也是一个浮点型。这样就能保留小数部分了。

26310e201beba903c44e7fe523ff7626.png

  那我们再思考一下,对于字面常量来说,是不是也存在这种问题呢?

bf99b6d8e904cdb84f2296185eec20de.png

  确实如此,字面常量也有这个问题。至于字面常量是什么类型,我们可以用上面的小技巧判断一下。一般来说,不带小数的整数字面常量,是int。带小数的字面常量,是double类型。

请在日常使用中额外注意,整型与整型运算,是无法得到浮点类型的。将会丢失小数点。

6. 强制类型转换

  那么如果我不想修改上面代码中,n1或n2的类型怎么办。好像以目前我们了解的知识,是无法解答的。因为整型与整型运算是无法得到浮点型的。因此,我们引入一个新的知识点,强制类型转换。使用公式:

(类型)需要转换的数据对象

5cadb3882d42122ff34dd386c551adb7.png

  在上面的代码中,我们把n1先强制转换为了float型,float再除以int。那么结果就是float类型了。n2先转换为double,再与int运算,结果为double。

请注意,强制类型转换,并不能影响n1和n2变量原本的类型。它们只是改变了运算时的临时数据对象的类型。

7. 赋值造成的类型转换

72211e5f528367d290a38c5badcb774c.png

  上面的代码中,n是int型,c是字符型(再次重申,字符型也是一种整型,只是它的取值范围刚好可以装得下,字符与数值映射的ASCII码)。

  我们把char型变量c值给了int型变量n,结果正常。

99395cab7d943964729058a9e0ae9b45.png

  如果反过来,把整型赋值给字符型呢?可以看到整型变量n存储的数值遭到了丢失。毕竟,字符型的最大范围是-128到127。那么这时结果就出错了。

小的整型类型可以赋值给大的,大的整型类型请勿赋值给小的。 除非你有这种特殊需求。

e3d1f178ada798b77ffe21c5d8a7232f.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值