g++ 在不使用 -Wconvert 的情况下将 double/float 转换为无符号整数时发出警告
g++ warn when double/float is converted to unsigned integer without using -Wconversion
可能的重复项:
g++ - 墙不警告双> int cast
根据这里的问题,从双精度/浮点数到无符号整数的直接转换是不可移植的。 我发现我的代码中有一些发生这种情况的情况,我想告诉 g++ 如果发生这种情况,我会警告我,但我找不到这样的选项。 有谁知道是否有这样做的选项?
注意:我确实看到了 -Wconversion,但这也警告了我不关心的各种其他转换(例如将 int 转换为无符号 int,根据标准是可移植的)。
编辑:这是一个我希望看到警告的代码示例:
double dblNumber = -234;
unsigned long uintNumber = dblNumber;
在 g++ 的一个版本中,这给了我一个整数值 0xFFFFFF16(在 2 的补码中为 -234)。 在另一个上,它给了我 0。 显然,代码是模棱两可的,这就是为什么它可以理解地不被认为是可移植的。
我知道你说你不想使用-Wconversion
但它警告你关心的问题,至少在 g++ 4.5 中,在将long
转换为unsigned long
时不会发出警告(例如)。对于它警告您在哪里执行合法所需转换的任何其他情况,只需投射它即可。您未来的维护者将非常感谢您明确表示正在执行已知的转换,而不是从代码上下文中猜测它是否有意。
当完成浮点到 int 的隐式转换时,截断的值无法适合目标类型,则行为是未定义的,正如您的示例很好地说明的那样。
如果 g++ 提供的唯一工具是 -Wconversion,也许你应该制作自己的工具来过滤警告以方便您(我想的是通常的 sed、awk、perl 或 php,但这取决于这些工具在您的系统上的可用性,如果您使用一个,也许您可以直接从您的 IDE 执行类似操作)。
您还可以使用 gcc 的特定编译指示指令来限制对特定文件甚至特定代码部分的转换检查。
用于在代码中查明发生有问题的转换的任何其他编程方法当然都可用于插入显式强制转换,这是您应该瞄准的目标。
- 没有从阵列<float>到阵列<int>的可行转换
- 没有合适的构造函数可以从"float"转换为"_D3DCOLORVALUE"
- 为什么我会收到此错误?无法将 {lb, ub} 从<大括号括起来的初始值设定项列表>转换为 float(**)(float*, int)
- 如何将 qml 的文本转换为 float 和 int
- 错误:无法将"float*"转换为"float"
- 缩小从double到float的转换
- 谷歌测试编译错误 Os X:函数式转换从"int"到"internal::FloatingEq2Matcher"的模糊转换<float>
- 如何有效地将一个大std::字符串的一部分转换为float
- 如何使用 std:from_chars 在 C++17 中从字符串转换为 int/float
- C++优化从 int 到 float 的数组转换
- OpenCL 将 float16 转换为 float*
- 在 C++ 中从 'const float*' 到 'float*' 的转换无效
- 如何修复"无法在初始化时将'Tmp'转换为'float'
- 如何将 std::array<double, 100> 转换为 std::array<float, 100> ?(避免明显的样板实现)
- 如何将可变字符串[]转换为float
- 警告:从 'char *' 到 'float *' 的强制转换将所需的对齐从 1 增加到 4 [-Wcast-align]
- 有没有一种优雅的方法可以将矢量<复杂<float>>转换为矢量<short>?
- MBED RTOS将Float转换为字符串/字符阵列
- 不知道参数 1 从 sf::Vector2i 到 const sf::Vector2i& 的转换<float>
- 显式类型转换 float(intvar) 结果为 int