2014-09-30 59 views
1

我面临一个小问题,我希望你能帮助我。谢谢。C++:警告:有符号和无符号表达式(Gmake,freebsd)

以下是错误代码:

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

,这里是我把引擎收录的代码,因为它太大了,把这些代码在论坛 FILE.CPP

+0

不过一个音符*为什么*生成警告 - 想象中的情况下m_vecDragonSoulNames有一大堆物品在其中;例如超过20亿项(假设您的计算机架构上sizeof(size_t)== 4)。在这种情况下,for循环中的比较行为会有所不同,具体取决于它是将两个值作为有符号还是无符号进行比较;在签名的情况下,m_vecDragonSoulNames可能会被重新解释为一个负值(!),这意味着for循环会立即终止而不执行循环体 - 可能不是您期望的行为。 – 2014-09-30 03:57:23

回答

2

转到第223行,您有:

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

正如你所看到的,iint型的,但确实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?

+0

你能否给我正确的语法来替换?我是C++初学者我意识到它不是如何制定语法// 我只是想消失这种警告。 – Reby210 2014-09-30 04:00:12

+0

@ Reby210看到编辑,最后的选择可能对您很方便。但是你应该更多地研究这个话题。 – JosEduSol 2014-09-30 04:05:54

+0

感谢JosEdu,它的工作原理。 – Reby210 2014-09-30 04:28:21

1

警告说,究竟是什么。您正在比较有符号和无符号整数。例如:

uint NUM = 5; 

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

的解决方案是

  1. 让所有的变量类型相同,
  2. 无视警告的
  3. 压制它
  4. 较低的错误报告级别编译因此根本不会生成它。
1

在此循环中,我是整数,其中m_vecDragonSoulNames.size()是无符号整数类型。让我无符号整数

相关问题