Cel*_*tas 17 c++ language-agnostic types
如果它们不需要额外的值范围,是否应该将变量声明为unsigned int?例如,在for循环中声明变量时,如果你知道它不会是负数,那么重要吗?一个比另一个快吗?在C++中声明unsigned int和unsigned一样不好吗?
要重新计算,即使不需要额外的范围,是否应该完成?我听说应该避免它们,因为它们会导致混淆(IIRC这就是为什么Java没有它们).
jua*_*nza 14
你应该使用无符号整数,因为它们没有任何意义使它们具有负值.这完全独立于范围问题.所以是的,你应该使用无符号整数类型,即使不需要额外的范围,不,unsigned int如果没有必要,你不应该使用s(或其他任何东西),但是你需要修改你所需要的定义.
Gho*_*st2 13
使用uints的原因是它为编译器提供了更多种优化.例如,如果它知道x是正的,它可以用'x'替换'abs(x)'的实例.它还开辟了各种按位'强度降低',只适用于正数.如果你总是将int /除以2的幂,则编译器可以用位移(即x*8 == x << 3)替换该操作,这往往会更快地执行.不幸的是,这种关系仅在"x"为正时才成立,因为负数以排除这种情况的方式编码.使用int,编译器可以应用此技巧,如果它可以证明该值始终为正(或者可以在代码中更早地修改为这样).在uint的情况下,这个属性很容易证明,这大大增加了它的应用几率.
另一个例子可能是等式y = 16 * x + 12.如果x可以是负数,则需要乘法和加法.然而,如果x总是正的,那么x*16项不仅可以用x << 4替换,而且因为该项总是以四个零结束,这就开始用二进制OR替换'+ 12'(尽可能长)因为"12"项少于16).结果将是y = (x<<4) | 12.
通常,'unsigned'限定符为编译器提供有关变量的更多信息,这反过来又允许它进行更多优化.
通常,您应该使用无符号整数.
就溢出等未定义的行为而言,它们更具可预测性.
这是一个很大的主题,所以我不会多说些什么.
除非您确实需要签名值,否则这是避免签名整数的一个非常好的理由.
此外,在范围检查时,它们更容易使用 - 您不必检查负值.
典型的经验法则:
如果您正在编写一个for带有索引作为控制变量的正向循环,那么您几乎总是需要无符号整数.事实上,你几乎总是想要size_t.
如果您正在编写一个for带有索引作为控制变量的反向循环,那么您应该使用有符号整数,原因很明显.可能ptrdiff_t会这样做.
需要注意的一件事是在不同大小的有符号值和无符号值之间进行转换.
您可能想要仔细检查(或三重检查)以确保演员表符合预期的方式.
系统地使用unsigned值何时不能为负数的问题不是Java没有unsigned,而是具有无符号值的表达式,尤其是与带符号的值混合时,如果您将无符号的值视为一个带符号的值,则有时会产生混淆的结果。具有移动范围的整数类型。无符号是一种模块化类型,不是将整数限制为正数或零。
因此,unsigned当您需要模块化类型或按位操作时,应使用传统视图。该视图在K&R中是隐式的-看如何使用int和unsigned-在TC ++ PL(第二版,第50页)中更明确:
的
unsigned整数类型是理想的用途在于治疗存储作为比特数组。用aunsigned代替anint来获得更多的比特来表示正整数几乎不是一个好主意。试图通过声明变量来确保某些值是正值unsigned通常会被隐式转换规则所破坏。