这里有类似的问题,但它们与循环索引中的特定用法有关。这个是更通用的案例。如果没有循环,如何处理此警告?
如何处理此简化案例中的警告以概述问题?
int(-3) >= size_t(31)
答案 0 :(得分:2)
投射至少一个操作数,使它们具有相同的符号。
将unsigned转换为signed时要小心:如果值太大,您将获得实现定义的行为。
在将符号转换为无符号时要小心 - 原始值为负时的行为是精确定义的,但可能会令人惊讶。如果表达式被重写为size_t(-3) >= size_t(31)
,那么它始终为true
。
请注意,示例中对int
的强制转换毫无意义 - 文字3
必须属于int
类型,并且将一元-
应用于该int
会产生{ {1}}结果。
答案 1 :(得分:2)
这是一个个案的基础,您只需要使用您对解决问题的了解即可。目标是在运行时避免逻辑错误,而不是消除警告消息。
将一个或另一个值转换为与另一个值相同会删除警告,但不会因逻辑错误而阻止运行时问题。
e.g。如果你有一个大无符号值并将其转换成要签名的值,那么它会翻转为负值,这会弄乱比较。相反,将-3转换为无符号将使其成为非常大的正值,这会使您正在尝试的比较陷入困境。当然,显式地转换值可以避免消息,但这些消息会警告您程序可能出现意外行为,您需要仔细考虑可能的&这些变量可能带来的值。
答案 2 :(得分:0)
要获得哪个值更大的答案,请使用签名的任意算术类型,如boost::cpp_int
auto v1 = int(-3);
auto v2 = size_t(31);
boost::cpp_int(v1) >= boost::cpp_int(v2);
如果您可以访问80位MMX寄存器,那么请考虑使用它们将这两个值存储为已签名和比较。