负数大于正数?类型提升!

1、写了如下程序,遇到问题,sym-sxm为负数,t.size()*10为正数,但是依然进入了循环?之前一直忽略了这一步,百思不得bug在哪,坑死人。。


2、上网查了一些资料后,改成如下程序,统一类型后进行比较,问题解决了。

3、这是为什么呢?有符号数的最高二进制位是符号位,负数的符号位是1。


4、但sym-sxm这个有符号负数与t.size()*10无符号正数进行比较时,类型提升了!

C语言中整数自动转换原则,当表达式中存在有符号和无符号类型时,所有类型自动转换成无符号类型。

所以统一类型再比较就没问题了。

5、类型提升

<1>、C语言中的整型提升规则编辑
如果运算的操作数是同一类型则不进行类型提升,如果操作数之间的类型不一致且都为整型,
(1)当操作数都为无符号整型或者都为无符号整型时,较短的操作数将转换为较长的操作数再进行运算(即sizeof的值较小的向sizeof较大的转换),
(2)当操作数中即有有符号整型又有无符号整型时,
     a、若有符号整型的操作数的长度小于等于无符号整型的操作数,那么其将转换为无符号整型的操作数,    
     b、若有符号整型的操作数的长度大于无符号整型的操作数,那么有符号整型转换为无符号整型参与运算后的结果,再转换为有符号整型。
<2>、C语言中的浮点类型提升规则编辑
(1)当操作数中最长的一个类型为long double类型,则其他操作数类型提升至long double类型再进行运算,
(2)当最长类型为double,则其他操作数提升至double类型,
(3)当最长类型为float,则其他操作数提升至float类型,
在这个过程中整型操作数全部转换为对应操作数的浮点类型,浮点数进行运算时的结果可能会用范围与精度更大的浮点类型表示。

猜你喜欢

转载自blog.csdn.net/qq_42517195/article/details/81010907