所以我明白了unsigned
变量只能保存正值并且signed
变量可以为负值和正值。但是,我不清楚为什么有人会使用unsigned
变量?那不是有风险吗?我的意思是我个人会坚持signed
变量以防万一。使用是否有内存/性能优势unsigned
变量?
为您的特定问题选择正确的原始数据类型是最重要的正确表达您的意图。例如,数组的大小也可以存储在有符号类型中(就像 Java 或 C# 中的情况),但为什么要这样做呢?数组的大小不能为负。无论如何,这样做只会让程序的读者感到困惑,并且不会给您带来任何好处。
不使用无符号值不会带来可衡量的性能提升;实际上这样做甚至可能很危险,因为无符号值可以容纳更大的正数比有符号的值内存大小相同,因此在分配时存在缩小转换的风险,例如,将自然无符号的数组大小分配为相同内存大小的有符号值:
// While unlikely, truncation can happen
int64_t x = sizeof(...);
// ~~~~^~~~~~~ uint64_t on my system
这些错误通常很难跟踪,但编译器可以更好地警告您犯下这些错误。
当然,您应该意识到在某些情况下使用无符号整数确实是危险的。作为例子,我写了一个简单的for
环形。我们不期望这个值i
为负数,因此我们做出看似正确的决定,使用无符号类型的值:
for(unsigned i = 5; i >= 0; --i)
{
}
但在这种情况下,循环永远不会终止,因为无符号值0 - 1
(发生在第五次迭代中)将是一个很大的正值(这称为环绕),从而击败了循环终止检查。
例如,可以这样解决:
for(unsigned i = 5; (i+1) > 0; --i)
{
}
但这不应该阻止您使用正确的数据类型。只要谨慎对待诸如值范围和环绕之类的事情就可以了。
综上所述,使用最合适且最能表达您意图的类型.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)