4

我知道无符号整数是臭名昭著的,C++ 开发人员通常会避免使用它。我有一个包含两个int不应包含负值的成员变量的类:

.
.
.
private:
    int m_Y_AxisLen;
    int m_X_AxisLen;
.
.
.

我以防止任何负数输入的方式设计了成员函数的逻辑。所以我确保这两个成员不会被赋予负值。
但是,当我使用PVS-Studio时,这也会带来一些警告。例如这里:

for ( int row = 0; row < getY_AxisLen( ); ++row )
{
    for ( int column = 0; column < getX_AxisLen( ) - 1; ++column )
    {
        if ( m_characterMatrix[ row ][ column ] == getFillCharacter( ) )
        {
            m_characterMatrix[ row ][ column ] = fillCharacter;
        }
    }
}

PVS-Studio 将索引归咎于我,rowcolumn不是memsize类型。这可能意味着我应该使用std::size_t rowand std::size_t column??
但是,如果我这样做了,那么它仍然会抱怨并说将无符号整数类型与getY_AxisLen( )(返回 an int)进行比较是危险的。
所以这就是我想重写我的类的一部分来切换到这个的原因:

private:
    uint32_t m_Y_AxisLen;
    uint32_t m_X_AxisLen;

我谦虚地寻求以前处理过此类问题的专业人士的见解和建议。当涉及到这些问题时,您会采取什么方法?

4

1 回答 1

6

许多“你不应该使用无符号整数”基本上只是害怕你会混淆有符号整数和无符号整数,导致回绕,或者避免复杂的整数提升规则。

但是在您的代码中,我认为没有理由不使用uint32_tand std::size_t,因为m_X_AxisLenandm_Y_AxisLen不应该包含负值,并且在这里使用uint32_tandstd::size_t更有意义:

所以,我建议改变m_X_AxisLenm_Y_AxisLen

std::size_t m_Y_AxisLen;
std::size_t m_X_AxisLen; // for consistency

改变rowcolumn_

std::size_t row = 0;
// and 
std::size_t column = 0;

使getX_AxisLen( )退货成为std::size_t

并制作for循环:

for ( int column = 0; column < getX_AxisLen( ) - 1; ++column )

到:

for ( int column = 0; column + 1 < getX_AxisLen( ); ++column )

因为如果getX_AxisLen()返回0getX_AxisLen( ) - 1将导致回绕。

基本上,使用有意义的东西。如果值不能为负,请使用unsigned类型。

于 2021-12-21T08:18:19.927 回答