如何处理“有符号/无符号不匹配”警告(C4018,无循环)?

时间:2017-03-06 09:51:56

标签: c++ visual-c++ warnings compiler-warnings

这里有类似的问题,但它们与循环索引中的特定用法有关。这个是更通用的案例。如果没有循环,如何处理此警告?

如何处理此简化案例中的警告以概述问题?

int(-3) >= size_t(31)

3 个答案:

答案 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寄存器,那么请考虑使用它们将这两个值存储为已签名和比较。