在C++中使用无符号变量的真正优势是什么?

Hbi*_*Giu 3 c++ variables unsigned variable-types

所以我理解unsigned变量只能保持正值,signed变量可以保持负面和正面.但是,我不清楚为什么有人会使用unsigned变量?这不风险吗?我的意思是我个人只是坚持使用signed变量以防万一.使用unsigned变量是否有内存/性能优势?

nsh*_*hct 7

为您的特定问题选择正确的原始数据类型就是要正确显示您的意图.例如,虽然数组的大小也可能存储在有符号的类型中(就像Java或C#中的情况一样),但为什么要这样做?数组不能为负数.无论如何,这样做只会使您的计划的读者感到困惑,并且不会给您带来任何好处.

不使用无符号值不会带来可测量的性能提升; 实际上它甚至可能是危险的,因为无符号值可以保存相同内存大小的有符号值更大的正数,因此在分配例如自然无符号到同一内存的有符号值的数组大小时会有缩小转换的风险尺寸:

// While unlikely, truncation can happen
int64_t x = sizeof(...);
//          ~~~~^~~~~~~ uint64_t on my system
Run Code Online (Sandbox Code Playgroud)

这些错误通常很难跟踪,但编译器已经更好地警告你提交它们.

当然,您应该知道在某些情况下使用无符号整数确实很危险.作为一个例子,我写了一个简单的for循环.我们不希望该值为i负值,因此我们做出看似正确的决定来使用无符号类型的值:

for(unsigned i = 5; i >= 0; --i)
{
}
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,循环将永远不会终止,因为无符号值0 - 1(在此处的第五次迭代中发生)将是一个很大的正值(这称为环绕),从而无法进行循环终止检查.

例如,这可以像这样解决:

for(unsigned i = 5; (i+1) > 0; --i)
{
}
Run Code Online (Sandbox Code Playgroud)

但这不应该阻止您使用正确的数据类型.只是对价值范围和环绕等事情保持谨慎,你会没事的.


总之,使用最合适的类型并且似乎表明您的意图最好.


Jam*_*mes 1

如果您的值实际上是位字段并且您进行位操作,则无符号更合适。

如果操作导致溢出,则默认情况下签名行为是未定义的。