C++ warning: comparison is always false due to limited range of data type [-Wtype-limits]

这是关于此警告消息的小而清晰的帖子,起初看起来很奇怪。但是仔细观察,其背后的原因非常清楚而直接。涉及到代码移植性。

警告:由于数据类型范围有限,比较始终为假

这是一段简单的代码,当在64位体系结构上运行时,将产生以上警告。

string subject = "A[1]"; 
string search = "1"; 
unsigned location = subject.find(search); // location is unsigned 
if( location == std::string::npos) 
    cout << " true"; 
else 
    cout << " false";

 

 

这里的问题是std::string::nposreturn size_t,它表示当前体系结构上的无符号本机整数大小。
因此,在32位体系结构上:
        unsignedsize_t都具有相同的大小,
但是,在64位计算机上:
        unsigned将会是size-4并且size_t将是size-8。
因此,当在64位计算机上运行。

因此,上述代码的正确解决方法是使location变量的大小为size_t类型。

string subject = "A[1]"; 
string search = "1"; 
size_t location = subject.find(search); // location is unsigned 
if( location == std::string::npos) 
    cout << " true"; 
else 
    cout << " false";

或者location变量的大小为uint64_t类型。

string subject = "A[1]";
string search = "1";
uint64_t location = subject.find(search);    // location is unsigned
if( location == std::string::npos)
    cout << " true";
else
    cout << " false";

 

你可能感兴趣的:(C++,c++)