C语言操作符和表达式以及数据类型提升实例以及疑惑

先上源码

该源码的主要是用将unsigned int、unsigned char、unsigned float的三种数据类型

分别将这三种数据类型进行小减大

然后if判断该相减表达式的正负值,然后根据结果打印出想对应的字符串

其结果如代码下面的截图

#include<stdio.h>

#include<stdlib.h>

int main(void)
{
unsigned int ua,ub;
unsigned char uca,ucb;
unsigned float ufa,ufb;
ua = 100;
ub = 200;
if( (ua -ub) >= 0 )
{
printf("ua-ub\n");
}

uca = 10;
ucb = 20;


if((uca - ucb) >= 0)
{
printf("uca - ucb \n");
}


ufa = 1.2;
ufb = 2.0;


if((ufa - ufb) > 0)
{
printf("ufa -ufb \n");
}


system("pause");
}


那么根据该结果来进行一一的分析

1:当数据类型是unsigned int时

当ua > ub的时候,ua - ub > 0的这个是没有什么问题的

当ua < ub 的时候 这个时候,根据打印结果 ,if(ua - ub > 0)这个判断是为真的。

ua- ub的这个表达式相减的结果会存在一个临时变量中,因为ua和ub都是unsigned int,所以该临时变量也是unsigned int类型

因此ua - ub相减的结果始终为unsigned int类型 所以始终是大于等于0,因此if的判断为真。

2:当数据类型是unsigned char时,这个时候跟unsigned int的结果不一样

当uca < ucb,  if(uca - ucb > 0)  这个条件判断不为真

一开始有点不理解,后来查了一些资料之后,才明白

在C和指针在操作符和表达式这一章提到,C提供的所有算术操作符即适用于浮点类型又适用于整数类型(除了%操作符之外,这个只支持操作整数)

因此但当char 和 short类型的数据进行算术操作的时候,会进行一个隐式转换,转换成操作符可以接收的数据类型,也就是会转换成整数数据类型。

但是unsigned char 会转换成 unsigned int 还是signed int?

这个数据类型的转换顺序如下

long double

double

float

unsigned long int

long int

unsigned int

int

数据的类型转换由下到上依次转换,因此当unsigned char向上转换的时候 转换为int类型,而不是usigned int 类型。

因此,当两个unsigned char相减的时候,会转换为int数据类型,然后再进行相减数学运算,然后相减的结果会存在一个int的临时变量中。

因此当uca < ucb 的时候uca - ucb 会产生一个小于零的结果,(uca - ucb)< 0。因此该if的条件不为真,所以不打印相对应的信息。

3:当数据类型是unsigned float时,跟unsigned int类似。两个数据的相减会存在一个unsigned float的临时变量的。

因此大减小也是一个大于等于零的值。

但是这里出现了一个百思不得其解的问题。

当ufa = 1.2;ufb = 2.0;有信息打印出来。

当ufb 赋值为 (1.2,2.0)这个范围 的时候,就不行了,没有信息打印出来,也不知道为啥?这个可能跟机器,以及编译器有关。有大神看到,还求告知。

当赋值为 >=2.0的时候,又可以。

总结

其实有的时候可以尽量避免使用a-b > 0这样的表达式进行一个大小的比较

多用 a > b 这样的形式进行比较。该语句使用的效率还比上面的要高,机器都不用进行算术运算,只要进行进行一个比较,判断标志寄存器的标志位就可以了,而且不会引起这么多问题。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值