由于计算机中类型的长度限制,会造成特殊的错误,比如:两个正数相加后的结果为负数,一般把这种计算错误成为溢出(overflow)错误,如代码 3 - 2 所示,将其复制到在线编辑器中并执行后,会发现溢出错误。在此强调,因为 printf 不同的输出控制符会对结果产生影响,是因为在 printf 中会做类型转换,并不是说计算结果的溢出被修正了。

    1. #include <stdio.h>
    2. int main(){
    3. short left = 32776;
    4. short right = 5;
    5. printf("1: %hd + %hd = %hd\n", left,right, left + right);
    6. printf("2: %d + %d = %d\n", left, right, left + right);
    7. return 0;
    8. }

    7a6ed6341cf029d7acf8e71d5463e3e.png
    类似的还有负数加负数,结果却为正数的情况,作为一个小练习留给大家。提示:修改 left、right 值即可,其他代码无须修改。
    第二个思考:如何正确的求出 left 与 right 的中间值 overflow - 图2 呢?

    1. #include <stdio.h>
    2. int main(){
    3. short left = 17;
    4. short right = 5;
    5. int a = (left + right)/2;
    6. printf("1: %hd + %hd = %hd\n", left,right, left + right);
    7. printf("2: %d + %d = %d\n", left, right, left + right);
    8. printf("a = %d\n", a);
    9. return 0;
    10. }

    e5089557d75d7a930fb35fa62b583d2.png
    学习总结:编程时一定注意输入法的状态。