【问题标题】:C++: warning: Signed and unsigned expression ( Gmake, freebsd )C++:警告:有符号和无符号表达式(Gmake,freebsd)
【发布时间】:2014-09-30 03:39:53
【问题描述】:

我遇到了一个小问题,希望你能帮助我。谢谢你。

这里是错误代码:

FILE.cpp: In member function 'bool DragonSoulTable::ReadAdditionalApplys()':
FILE.cpp:223: warning: comparison between signed and unsigned integer expressions

这是我放在 pastebin 上的代码,因为它太大,无法将代码放在论坛上 FILE.CPP

【问题讨论】:

  • 只是关于为什么会生成警告的注释——想象一下 m_vecDragonSoulNames 中有 lot 项的情况;例如超过 20 亿个项目(假设您的计算机架构上的 sizeof(size_t)==4)。在这种情况下,您的 for 循环中的比较行为会有所不同,具体取决于它将两个值比较为有符号还是无符号;在已签名的情况下,m_vecDragonSoulNames 可能会被重新解释为负值(!),这意味着 for 循环将立即终止而无需执行循环体——可能不是您所期望的行为。

标签: c++ expression unsigned signed


【解决方案1】:

转到第 223 行,你有:

for (int i = 0; i < m_vecDragonSoulNames.size(); i++)

如您所见,i 的类型为 int,但 m_vecDragonSoulNames.size() 是否返回 int??

其实你的代码中有很多这样的比较。

当您比较有符号和无符号类型时,编译器会给出警告(而不是错误),这是因为这种类型的范围不同。这有充分的理由,如果你不小心,结果可能会令人惊讶......

如果您知道进行此类比较是安全的,则可以将其中一个值显式转换为与另一个值相同的类型,警告就会消失。

类似:

unsigned int a = someUnisgnedValue;
int b = someSignedValue; 
if ((unsigned) b < a)    
   //... do something

或者你可以同时使用两种相同的类型。例如,在代码的第 223 行中,您可以这样做:

for (unsigned int i = 0; i < m_vecDragonSoulNames.size(); i++)

请检查另一个问题:When to use unsigned values over signed ones?

【讨论】:

  • 你能给我正确的语法来替换吗?我是 c ++ 的初学者,我意识到这不是如何制定语法 // 我只是想消除那个警告。
  • @Reby210 见编辑,最后的选择可能对你很方便。但是你应该更多地研究这个话题。
【解决方案2】:

正是警告所说的内容。您正在比较有符号和无符号整数。例如:

uint NUM = 5;

for (int i=0; i < NUM; i++) // Here you compare int and uint

解决办法是

  1. 将所有变量设为同一类型,
  2. 忽略警告
  3. 抑制它
  4. 使用较低的错误报告级别进行编译,因此根本不会生成它。

【讨论】:

    【解决方案3】:

    在 for 循环中 i 是整数,而 m_vecDragonSoulNames.size() 是无符号整数类型。使 i 无符号整数

    【讨论】:

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