考虑以下代码片段:
long long someVar64 = 0LL;
int someVar32 = someVar64;
如果不明显,这里有一个潜在的错误,即64位值被分配给32位值,导致位丢失。在这种情况下,它很好,因为我们不关心0的高位,但如果我改变常量,我可以很容易地创建一个bug。
为什么GCC(4.4.3)没有为此代码生成警告?我记得以前的旧版本。
答案 0 :(得分:3)
此警告由-Wconversion启用。请注意,-Wall或-Wextra未启用它。
-Wconversion
警告可能会改变值的隐式转换。这包括转化 在实数和整数之间,如x是
abs (x)
双;签名和未签名之间的转换,如unsigned ui = -1;
转换为较小的类型,例如sqrtf (M_PI).
请勿警告
abs ((int) x)
和ui = (unsigned) -1
之类的明确演员表, 或者如果abs (2.0)
中的转换没有改变该值。[...]
来源:http://gcc.gnu.org/onlinedocs/gcc-4.8.1/gcc/Warning-Options.html#Warning-Options