处理无符号整数

Dealing with unsigned integers

我知道 无符号整数 是臭名昭著的,通常被 C++ 开发人员避免使用。我有一个 class 和两个不应包含负值的 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 rowstd::size_t column??
但是,如果我那样做,那么它仍然会抱怨并说将无符号整数类型与 getY_AxisLen( )(returns 和 int)进行比较是危险的。
所以这就是我想重写部分 class 以切换到这个的原因:

private:
    uint32_t m_Y_AxisLen;
    uint32_t m_X_AxisLen;

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

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

但是在你的代码中,我认为没有理由不使用 uint32_tstd::size_t,因为 m_X_AxisLenm_Y_AxisLen 不应该包含负值,并且使用 uint32_tstd::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( ) returns 成为 std::size_t

并创建 for 循环:

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

至:

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

因为如果getX_AxisLen() returns 0, getX_AxisLen( ) - 1会造成回绕

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