先上源码
该源码的主要是用将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 这样的形式进行比较。该语句使用的效率还比上面的要高,机器都不用进行算术运算,只要进行进行一个比较,判断标志寄存器的标志位就可以了,而且不会引起这么多问题。