签名/未签名的比较警告是什么意思?

时间:2014-11-06 17:54:13

标签: c++

auto.cpp: In function ‘int autooo(unsigned int)’:
auto.cpp:33:25: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]

我正在做makefile,我已经运行了makefile并制作了一个auto.o但是我仍然遇到这个错误,下面是我的autooo.cpp,auto.h

我不知道未签名和签名的内容:\请帮助

auto.h

#ifndef function_H_
#define function_H_

int autooo(unsigned);
int interr(unsigned);


#endif /* function_H_ */

autooo.cpp

#include <iostream>   
#include <cstdlib>  //for random functions
#include "prime.h"
#include "auto.h"
using namespace std;


#ifndef auto_CPP_
#define auto_CPP_

int autooo(unsigned);

int autooo(unsigned a)
{       
    int b=50;
    unsigned numberFound = 0;

    do
    {    
        ++a;    

        if (isPrime(a))    
        {    
            ++numberFound;    
            cout << a << "is prime number" <<endl;    
        }    
    } while (numberFound < b);

    return 0;
}

#endif

5 个答案:

答案 0 :(得分:2)

编译器警告该代码包含行中unsigned intsigned int的比较

while (numberFound < b);

这与makefile或make无关。

您可以通过更改

来解决这个问题
int b=50;

unsigned b = 50;

或通过更改

unsigned numberFound = 0;

int numberFound = 0;

this answer to another SO question

中解释了在比较signed intunsigned int时可能遇到的问题

答案 1 :(得分:0)

在这一行

while (numberFound < b);

第一个是unsigned int,第二个是int。所以你必须使它们成为相同的类型,或者如果你完全确定它们中的一个。

正如Etan评论的那样:

&#34;盲目地抛弃警告只是为了避免警告是一个错误。您需要了解警告告诉您的内容并确定正确的修复方法。&#34;

答案 2 :(得分:0)

您收到有关比较有符号和无符号类型的警告,因为有符号和无符号整数的范围不同。 如果你必须进行这样的比较,你应该明确地将其中一个值转换为与另一个值兼容,但需要检查以确保你的强制转换有效。

例如: -

int i = someIntValue();

if (i >= 0)
{
    // i is non-negative, so it is safe to compare to unsigned value
    if ((unsigned)i >= u)
        // do something
}

答案 3 :(得分:0)

它说你正在比较两种不同的东西。最值得注意的是,一个范围不适合另一个范围。

是的,我在那里。存在无符号范围内的数字,不能表示为有符号数字

答案 4 :(得分:-1)

在比较已签名和未签名的代码之前键入代码以避免警告

int a;
unsigned int b;

if(a==b) gives warning

if(a == (int)b)

将解决您的问题

修改

盲目投射会导致一些意想不到的结果

警告是因为有符号和无符号的范围不同。

当用于比较的有符号整数大于零时,转换将正常工作。

所以在比较之前检查有符号整数是否大于零

更多信息here