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

时间:2014-09-25 01:47:25

标签: c++

在FreeBSD中使用gcc编译c ++源代码时出现此警告。

有人可以解释并帮助我解决我遇到的问题吗?

以下是整个源代码的链接,它被放置在pastebin上,因为它包含7000行代码。 Source char.cpp

以下是警告信息:

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

2 个答案:

答案 0 :(得分:3)

扩展@KaliG的回答:

3065 行,您宣布: DWORD exp = GetExp();

现在什么是DWORD?嗯,它代表双字,而这个C ++实现(Win32)上的“字”是16位。它是一个typedef,实际上是无符号整数http://en.wikipedia.org/wiki/Word_%28computer_architecture%29

另一个变量,amount是一个定义为(signed)int 类型的参数。

所以你要比较有符号和无符号整数 - 这会导致警告。 您可以通过简单地将金额转换为unsigned int(或“DWORD”)来解决此问题,因为您已经验证它实际上是正数。

所以将行改为:

if (amount < 0 && exp < (DWORD) -amount)

这应该有效 - 但我不知道你的方法是如何运作的。

旁注:匈牙利符号真是可怕的东西 - 所以你应该真正深入研究他们实际使用的不同类型名称。 http://en.wikipedia.org/wiki/Hungarian_notation

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

旁注3:阅读 2s补充,了解CPU内部的ALU(http://en.wikipedia.org/wiki/Arithmetic_logic_unit)实际在做什么:http://en.wikipedia.org/wiki/Two%27s_complement

答案 1 :(得分:1)

从抛出的错误中,我会说这是因为&#39; exp&#39;是一个未签名或签名的变量,而&#39; amount&#39;是相反的,因此你得到比较错误的原因。

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

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