C语言:如何强制算术表达式转换为更宽的数据类型?
嗨,刚看到你补充的内容——完全理解,新手刚接触C语言时很容易把^当成幂运算符,踩这个坑太正常了,先把这个基础点搞明白绝对是正确的第一步!回到你原本的问题,在64位Ubuntu的GCC环境下,要把算术表达式强制转换为更宽的数据类型,其实有几种可靠的方法:
显式强制转换单个操作数:C语言的类型提升规则是,当表达式中有不同类型的操作数时,会自动把窄类型提升到宽类型。所以你只需要把表达式中的至少一个操作数强制转换成目标宽类型,整个表达式的运算就会在这个宽类型下进行。比如你原本是
int a = 100, b = 200;,如果直接算a * b是int类型,改成(long long)a * b,那么整个乘法运算就会以long long(64位整数)的精度执行,结果也是long long类型。用宽类型变量存储中间结果:如果表达式比较复杂,你可以先把参与运算的变量赋值给宽类型的变量,再进行计算。比如:
int x = 50000, y = 60000; long long x_wide = x; long long y_wide = y; long long result = x_wide * y_wide;这样所有运算都在long long类型下进行,不会出现窄类型溢出的问题。
注意运算顺序的强制转换:如果需要对整个表达式的结果进行转换,要避免先在窄类型下运算再转换(那样可能已经溢出)。比如
(long long)(x * y)就不如(long long)x * y可靠——前者是先算int类型的x*y(可能溢出),再转成long long;而后者是先把x转成long long,再和y运算,全程都是宽类型。
另外补充一句:如果你的需求是计算幂运算,C标准库的<math.h>里有pow()函数,但它是处理浮点类型的;如果是整数幂,你可以自己实现一个循环乘法的函数,或者用快速幂这类高效的位运算技巧,不过这就是另一个话题啦。
内容的提问来源于stack exchange,提问作者gws

