C++ 有符号和无符号整数表达式之间的比较

C++ 有符号和无符号整数表达式之间的比较,c++,C++,我在FreeBSD中使用gcc在c++中编译源代码时收到此警告 有人能解释一下并帮我解决这个问题吗 下面是整个源代码的链接,它被放在pastebin上,因为它包含7000行代码 以下是警告信息: In member function 'void CHARACTER::PointChange(BYTE, int, bool, bool)': 从抛出的错误来看,我认为这是因为'exp'是无符号或有符号变量,而'amount'是相反的,因此引发比较错误 请在声明这些变量的地方张贴代码行: 验证您是否

我在FreeBSD中使用gcc在c++中编译源代码时收到此警告

有人能解释一下并帮我解决这个问题吗

下面是整个源代码的链接,它被放在pastebin上,因为它包含7000行代码

以下是警告信息:

In member function 'void CHARACTER::PointChange(BYTE, int, bool, bool)':

从抛出的错误来看,我认为这是因为'exp'是无符号或有符号变量,而'amount'是相反的,因此引发比较错误

请在声明这些变量的地方张贴代码行:


验证您是否错误地将这两个变量中的任何一个声明为有符号/无符号。

展开@KaliG的回答:

您在第3065行声明: DWORD exp=GetExp

现在什么是德沃德?它代表双字,在这个C++实现Win32上有一个字是16位。它是一个typedef,实际上是一个无符号整数。

另一个变量amount是定义为带符号int类型的参数

因此,您正在比较有符号整数和无符号整数-这会导致警告。 您可以通过简单地将amount转换为无符号int或DWORD来解决这个问题,因为您已经验证了它实际上是正数

因此,将行更改为:

如果金额<0&&exp 这应该行得通——但除此之外,我不知道你的方法是如何工作的

旁注:匈牙利符号是非常可怕的东西-所以你应该深入了解他们使用的不同类型的名称是什么

旁注2:不要使用ALLCAPS类名。。。开发人员习惯于认为这些标识符是常量,因此您会混淆其他可能阅读您的代码的人


旁注3:阅读2s补码以了解CPU内ALU的实际操作:

您需要向我们显示amount和exp的声明。错误很明显,请检查问题中未显示的变量类型。粗略猜测exp声明为无符号。在这种情况下,你的if语句永远不可能是真的。你能给我正确的语法吗。我是c++的初学者。我只做了“你好世界”节目。关于c++的三天阅读。@HotLicks如果amount足够负,exp<-amount可以应用,因此该语句可能非常真实。编译器可能只是猜测并为您执行强制转换,这是很有可能的。然而,它必须打印出一个警告…我不想通过7000行代码,请做一些工作,并提取出代码的相关部分。只需在声明变量的地方和/或可能对变量进行类型转换的任何地方发布即可。我们在这里是为了帮助你,而不是为你做工作;你可以试着用我和其他人首先指出的东西来修复它,看看它是否能修复它。我明白,谢谢你试图帮助我。最后调用的代码行是什么。第71行是第3.088行。一个包含7000行代码的文件太长,无法管理。。。帮你自己一个忙,写一些适当的单元测试并隔离问题-void CHARACTER::PointChangeBYTE type,int amount,bool bAmount,bool bBroadcast太长,不遵守单一责任原则。您只是在询问一个这么长的方法/类的bug。@Centril注释就在这里。试着按照我的建议去做,看看你是否得到了积极的结果。否则,这里没有人真的会通过7000行代码来查看问题的来源。谢谢Kali,它成功了。谢谢你帮助我。我终于明白了什么是德沃德:现在我只解决了100个警告:其中40个是你帮助过你的:只要你学会如何在未来处理类似的问题,那就是进步=