C++ 如何处理“;有符号/无符号不匹配”;警告(C4018,无回路)?

C++ 如何处理“;有符号/无符号不匹配”;警告(C4018,无回路)?,c++,visual-c++,warnings,compiler-warnings,C++,Visual C++,Warnings,Compiler Warnings,这里也有类似的问题,但它们与循环索引中使用的特定情况有关。这是一个更一般的情况。如果没有循环,如何处理此警告 如何处理这个简化案例中的警告来概括问题 int(-3) >= size_t(31) 强制转换至少一个操作数,使它们具有相同的符号性 将unsigned强制转换为signed时要小心:如果值太大,您将获得实现定义的行为 将signed转换为unsigned时要小心-精确定义了原始值为负值时的行为,但这可能会令人惊讶。如果表达式被重写为size\u t(-3)>=size\u t(3

这里也有类似的问题,但它们与循环索引中使用的特定情况有关。这是一个更一般的情况。如果没有循环,如何处理此警告

如何处理这个简化案例中的警告来概括问题

int(-3) >= size_t(31)

强制转换至少一个操作数,使它们具有相同的符号性

将unsigned强制转换为signed时要小心:如果值太大,您将获得实现定义的行为

将signed转换为unsigned时要小心-精确定义了原始值为负值时的行为,但这可能会令人惊讶。如果表达式被重写为
size\u t(-3)>=size\u t(31)
,那么它总是
true


请注意,本例中对
int
的强制转换是毫无意义的-文本
3
必须是
int
类型,对其应用一元
-
将得到
int
结果。

强制转换至少一个操作数,使它们具有相同的符号性

将unsigned强制转换为signed时要小心:如果值太大,您将获得实现定义的行为

将signed转换为unsigned时要小心-精确定义了原始值为负值时的行为,但这可能会令人惊讶。如果表达式被重写为
size\u t(-3)>=size\u t(31)
,那么它总是
true


请注意,本例中对
int
的转换是毫无意义的-文本
3
必须是
int
类型,对其应用一元
-
将得到
int
结果。

这是一个逐案的基础,您只需利用您对正在解决的问题的了解来进行调用。目标是避免运行时出现逻辑错误,而不是消除警告消息

将一个或另一个值强制转换为与另一个相同会删除警告,但不会防止由于逻辑错误而出现运行时问题


e、 如果你有一个大的无符号值,并将其强制转换为有符号值,那么它将翻转为负数,这将打乱比较。相反,将-3翻转为unsigned将使其变成一个非常大的正值,这将破坏您正在尝试的比较。当然,显式地铸造这些值可以避免消息,但是这些消息警告您程序中可能出现的意外行为,您需要仔细考虑这些变量可能的和可能的值。你只需要利用你对你正在解决的问题的了解来打电话。目标是避免运行时出现逻辑错误,而不是消除警告消息

将一个或另一个值强制转换为与另一个相同会删除警告,但不会防止由于逻辑错误而出现运行时问题


e、 如果你有一个大的无符号值,并将其强制转换为有符号值,那么它将翻转为负数,这将打乱比较。相反,将-3翻转为unsigned将使其变成一个非常大的正值,这将破坏您正在尝试的比较。当然,显式地铸造这些值可以避免消息,但是这些消息警告您从程序中可能出现的意外行为,您需要仔细考虑这些变量可能的和可能的值。

以获得哪个值更大,使用署名的任意算术类型(如

)。

如果您可以访问80位MMX寄存器,那么考虑使用它们来存储这两个值作为已签名和比较。

< P>以获得哪个值更大,使用像

这样的符号任意算术类型。

如果您可以访问80位MMX寄存器,那么考虑使用它们来存储这两个值作为签名和比较。

我会说最好的方法是始终使用正确的数据类型。您所表达的表达式的目的是什么?你用这个表达式试图解决的实际问题是什么?该表达式本身没有上下文是无用的。您可以检查@SingerOfTheFall类型是否正确(第一个有符号,第二个无符号),是否对应于不同的协议,并需要知道哪个值更大。我认为最好的方法是始终使用正确的数据类型。您显示的表达式的用途是什么?你用这个表达式试图解决的实际问题是什么?该表达式本身和没有上下文都是无用的。您可以检查@SingerOfTheFall类型是否正确(第一个有符号和第二个无符号),是否对应于不同的协议,并需要知道哪个值更大。实际上,如果您有一个大的无符号值并将其强制转换为有符号的,则行为是由实现定义的。它可能会反转为负值,但也可能在最大可能的int(或仅返回零)时饱和。需要转换为既能转换为两个范围的类型。实际上,如果有一个较大的无符号值并将其转换为有符号的,则行为由实现定义。它可能会反转为负数,但也可能在最大可能的整数处饱和(或仅返回零)。需要转换为能够同时转换两个范围的类型
auto v1 = int(-3);
auto v2 = size_t(31);
boost::cpp_int(v1) >= boost::cpp_int(v2);