处理无符号整数

问题描述 投票:0回答:1

我知道无符号整数是臭名昭著的并且通常被 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 因索引

row
column
不属于
memsize
类型而责怪我。这可能意味着我应该使用
std::size_t row
std::size_t column
??
但如果我这样做了,那么它仍然会抱怨并说将无符号整数类型与
getY_AxisLen( )
(返回
int
)进行比较是危险的。
所以这就是我想重写部分课程以切换到此的原因:

private:
    uint32_t m_Y_AxisLen;
    uint32_t m_X_AxisLen;

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

c++ arrays unsigned-integer static-code-analysis pvs-studio
1个回答
8
投票

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

但是在您的代码中,我认为没有理由不使用

std::uint32_t
std::size_t
,因为
m_X_AxisLen
m_Y_AxisLen
不应包含负值,并且使用
std::uint32_t
std::size_t
在这里更有意义:

所以,我建议将

m_X_AxisLen
m_Y_AxisLen
更改为:

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

row
column
更改为

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

Make

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()
返回
0
getX_AxisLen( ) - 1
将导致环绕。

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

unsigned
类型。

© www.soinside.com 2019 - 2024. All rights reserved.