处理无符号整数
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 将索引 row
和 column
归咎于我不是 memsize
类型。这可能意味着我应该使用 std::size_t row
和 std::size_t column
??
但是,如果我那样做,那么它仍然会抱怨并说将无符号整数类型与 getY_AxisLen( )
(returns 和 int
)进行比较是危险的。
所以这就是我想重写部分 class 以切换到这个的原因:
private:
uint32_t m_Y_AxisLen;
uint32_t m_X_AxisLen;
我虚心向以前处理过此类问题的专业人士寻求见解和建议。当涉及到这些问题时,您的方法是什么?
很多那些“你不应该使用无符号整数”的人基本上只是害怕你会混淆有符号整数和无符号整数,导致环绕,或者避免复杂的整数提升规则。
但是在你的代码中,我认为没有理由不使用 uint32_t
和 std::size_t
,因为 m_X_AxisLen
和 m_Y_AxisLen
不应该包含负值,并且使用 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;
使 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
类型。
我知道 无符号整数 是臭名昭著的,通常被 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 将索引 row
和 column
归咎于我不是 memsize
类型。这可能意味着我应该使用 std::size_t row
和 std::size_t column
??
但是,如果我那样做,那么它仍然会抱怨并说将无符号整数类型与 getY_AxisLen( )
(returns 和 int
)进行比较是危险的。
所以这就是我想重写部分 class 以切换到这个的原因:
private:
uint32_t m_Y_AxisLen;
uint32_t m_X_AxisLen;
我虚心向以前处理过此类问题的专业人士寻求见解和建议。当涉及到这些问题时,您的方法是什么?
很多那些“你不应该使用无符号整数”的人基本上只是害怕你会混淆有符号整数和无符号整数,导致环绕,或者避免复杂的整数提升规则。
但是在你的代码中,我认为没有理由不使用 uint32_t
和 std::size_t
,因为 m_X_AxisLen
和 m_Y_AxisLen
不应该包含负值,并且使用 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;
使 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
类型。