重读The C programming Lanuage 笔记一:类型转换

首先说自动类型转换: 

 当一个运算符的几个操作数类型不同时,就需要吧他们转换位某种共同的类型。一般来说,自动转换把“较低”的类型转换为”较高“的类型。运算结果为较高的类型

以下是不严格的规则:

  首先,如果任何一个操作数为long double类型,则将另外一个操作数转换为long double类型;

  否则,如果任何一个操作数为double类型,则将另外一个操作数转换为double类型;

  否则,如果任何一个操作数为float类型,则将另外一个操作数转换为float类型;

  否则,对两个操作数进行整型提升;然后,如果任何一个操作数为unsigned long int类型,则将另外一个操作数转换为unsigned long int类型;

  否则,如果任何一个操作数为long int类型,而另外一个操作数为unsigned int类型;则结果依赖于long int类型是否可以表示所有的unsigned int类型的值。如果可以,则将unsigned int类型转换为long int;如果不可以,则将两个操作数转换为unsigned long int类型;

  否则,如果任何一个操作数为long int类型,则将另外一个操作数转换为long int类型;  

  否则,如果任何一个操作数为unsigned int类型,则将另外一个操作数转换为unsigned int类型;

  否则,将两个操作数都转换成int类型。

    (以上内容摘自书中,典型的 if...else if ......else 有没有很清晰的感觉?哈哈)

 下面是个例子

 1 int main()
 2 {    
 3     if (-1 < (unsigned int)1) {
 4         printf("-1 is less than (unsigned int)1\n");
 5 
 6     }
 7 
 8     else {
 9         printf("-1 NOT less than (unsigned int)1\n");
10             }
11        return 012 }
13     
14     

输出结果会是什么?答案是 -1 NOT less than (unsigned int)1

为什么? 看上述规则

  此时将-1转换成unsigned int类型 即为 4G-1 >1;

那么再来看一个例子:

 1 int main()
 2 {    
 3     if (-1 < (unsigned char)1) {
 4         printf("-1 is less than (unsigned char)1\n");
 5         }
 6     else {       
 7         printf("-1 NOT less than (unsigned char)1\n");
 8     }
 9 
10     return 0;
11 }

结果是:-1 is less than (unsigned char)1

又是为什么?难道不是转换为unsigned char值为255了吗?

还是看规则:否则,对两个操作数进行整型提升。

首先看什么是整型提升。书中原话(当然,是中文版。。)

  如果原始类型的所有值都能用int类型表示,则其值将被转换为int类型,否则转换为unsigned int类型。这一过程称为整型提升。

所以此时-1和unsigned char都转换为int类型,即为 -1 < 1.

不过书中还说:当把一个char类型转换为int类型值时,对不同机器,其结果不同。在某些机器中,如果char值的最左一位是1,中文转换为负数。而在另一些机器中则在char类型值的左边添加0,即为正值。     

  所以说呢,第二个例子的结果取决于集体的实现。不过我试了一下,使用不同机器的结果是相同的。。(包括linux系统)

 

接下来是强制类型转换

  在任何表达式中都可以使用一个称为强制类型转换的一元运算符强制进行显示类型转换。

直接看个简单例子:

<math.h>中的sqrt函数,其参数是double类型。

1 #include <math.h>
2 
3 int main (){
4     int N;
5        
6     int a = sqrt((double) N);
7 }

上述代码中使用了两次强制类型转换:第一次(double)N,将N从int转换为double型此时如果写为sqrt(N)是不正确的,因为其参数是double型

  第二次将a从double型转换为int型。还要说明的是强制类型转换只是生成了指定类型的值,而N的值本身并没有改变。即

double x;

int N;

x = (double)N;

强制转换后N仍是int类型,只是生成了与N具有相同值的double类型的x。

在最初的两个例子,是之前看到一篇博文中的,本想附上链接,但是找不到了,抱歉。

以上,如有不正确的地方恳请纠正,并原谅我的无知与卖弄。

 

转载于:https://www.cnblogs.com/Yiaos/p/5321211.html

python023基于Python旅游景点推荐系统带vue前后端分离毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
JSP基于SSM网上医院预约挂号系统毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值