【问题标题】:C++ Compile Error (comparison between signed and unsigned integer expressions)C++ 编译错误(有符号和无符号整数表达式之间的比较)
【发布时间】:2017-05-21 13:22:27
【问题描述】:

我需要有关此消息的帮助:

char_cards.cpp:在成员函数“void CHARACTER::Cards_pullout()”中: char_cards.cpp:88:警告:有符号和无符号之间的比较 整数表达式

有人能解释一下这个错误是什么意思吗?我认为问题出在 DWORD 上,但我不知道出了什么问题。

这是函数:

DWORD CHARACTER::GetEmptySpaceInHand()
{
    for (int i=0; i<MAX_CARDS_IN_HAND; ++i)
    {
        if (character_cards.cards_in_hand[i].type == 0)
            return i;
    }
    return -1;
}
void CHARACTER::Cards_pullout()
{
    DWORD empty_space = GetEmptySpaceInHand(); 
    if (empty_space == -1) // Here is the error.
    {
        #ifdef __MULTI_LANGUAGE_SYSTEM__
        ChatPacket(CHAT_TYPE_INFO, LC_TEXT(GET_LANGUAGE(this), "You don't have space in hands."));
        #else
        ChatPacket(CHAT_TYPE_INFO, LC_TEXT("You don't have space in hands."));
        #endif
        return;
    }
    RandomizeCards();
    SendUpdatedInformations();
}

【问题讨论】:

  • 警告的哪一部分你不明白?
  • 假设第 88 行是带有 if 语句和比较表达式的行,请记住 DWODRD 是一个 unsigned 类型。比较 unsigned 和 singed 类型不会很好(因为 unsigned 类型永远不能有负值)。
  • 所以我必须检查 if (empty_space == 0) ?
  • @FrezyFrezy 这取决于 GetEmptySpaceInHand 返回的内容,以及您实际想要测试的内容。
  • 为什么选择DWORD而不是int作为返回类型?

标签: c++


【解决方案1】:

将无符号整数初始化为-1 定义明确,并将无符号整数设置为其最大值。所以使用 -1 来表示错误情况是可以的。要消除警告,您有几个选择:

1) 使用static_cast。这表明您知道转换并且是有意的:

if empty_space == static_cast<DWORD>(-1)) { ...

2) 使用std::numeric_limits&lt;DWORD&gt;::max() 代替-1。这将需要包含 limits 标头。

if (empty_space == std::numeric_limits<DWORD>::max()) { ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-15
    • 2013-11-11
    • 2011-04-09
    • 2015-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多