【发布时间】:2011-03-16 14:56:54
【问题描述】:
我总是将 unsigned int 用于不应该为负数的值。但是今天我 在我的代码中注意到这种情况:
void CreateRequestHeader( unsigned bitsAvailable, unsigned mandatoryDataSize,
unsigned optionalDataSize )
{
If ( bitsAvailable – mandatoryDataSize >= optionalDataSize ) {
// Optional data fits, so add it to the header.
}
// BUG! The above includes the optional part even if
// mandatoryDataSize > bitsAvailable.
}
我是否应该开始使用 int 而不是 unsigned int 作为数字,即使它们 不能是负数吗?
【问题讨论】:
-
出了什么问题:if (bitsAvailable >= optionalDataSize +mandatoryDataSize) { ... } ?
-
仅供参考,Java 不支持无符号类型,因此如果您打算让代码与 Java 互操作,则应避免使用这些类型,除非您确实需要特定值的类型范围。我不认为仅出于表明不支持/不允许负值的目的而使用 unsigned 是合适的。
-
另一个仅供参考:这类错误是好的静态代码分析器会为您找到的那种。 Coverity 会发现像这个一样的问题,没有使用任何其他的足够多的说,但我相信他们中的大多数人都会抓住这一点。以下是可用工具列表:en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis
-
另见:stackoverflow.com/questions/1951519/when-to-use-stdsize-t 用于 C++,但答案仍然大多适用
-
@Russell,它也不完美。加法可能会导致溢出并换行 unsigned。
标签: c coding-style