C++ 如果没有必要,是否应该使用无符号整数?

C++ 如果没有必要,是否应该使用无符号整数?,c++,language-agnostic,types,C++,Language Agnostic,Types,如果不需要额外的值范围,是否应该将变量声明为无符号int?例如,当在For循环中声明变量时,如果您知道它不会为负,那么这有关系吗?一个比另一个快吗?声明一个未签名int是否为C++中的无符号? 要重复,即使不需要额外的范围,是否也应执行?我听说应该避免它们,因为它们会引起混淆(IIRC,这就是为什么Java没有它们)。当它们的值为负值没有意义时,应该使用无符号整数。这与射程问题完全无关。因此,是的,即使不需要额外的范围,也应该使用无符号整数类型,不,如果不需要,也不应该使用无符号整数s(或任何其

如果不需要额外的值范围,是否应该将变量声明为无符号int?例如,当在For循环中声明变量时,如果您知道它不会为负,那么这有关系吗?一个比另一个快吗?声明一个未签名int是否为C++中的无符号?
要重复,即使不需要额外的范围,是否也应执行?我听说应该避免它们,因为它们会引起混淆(IIRC,这就是为什么Java没有它们)。

当它们的值为负值没有意义时,应该使用无符号整数。这与射程问题完全无关。因此,是的,即使不需要额外的范围,也应该使用无符号整数类型,不,如果不需要,也不应该使用无符号整数
s(或任何其他类型),但是,您需要修改对所需内容的定义。

在几乎所有体系结构中,有符号操作和无符号操作的成本是相同的。因此,在效率方面,使用unsigned-over-signed不会有任何优势。但是正如您所指出的,如果您使用unsigned,您将拥有更大的范围,使用uint的原因是它为编译器提供了更广泛的优化。例如,如果它知道x为正,则可以将“abs(x)”的实例替换为“x”。它还打开了各种只适用于正数的按位“强度缩减”。如果您总是将一个整数乘以/除以二的幂,那么编译器可能会用一个位移位来替换该操作(即x*8==x,通常应该使用无符号整数

它们在溢出等方面的未定义行为方面更加可预测。
这本身就是一个巨大的主题,所以我不想多说。
这是避免使用有符号整数的一个很好的理由,除非您确实需要有符号值

此外,在进行范围检查时,它们更易于使用--您不必检查负值

典型的经验法则:

  • 如果您正在为带有索引作为控制变量的
循环编写正向
,则几乎总是需要无符号整数。事实上,您几乎总是需要
size\u t

  • 如果您正在为带有索引作为控制变量的
  • 循环编写反向
    ,出于明显的原因,您可能应该使用有符号整数。可能可以使用
    ptrdiff\u t

    在不同大小的有符号和无符号值之间进行转换时,需要注意一点。

    您可能需要进行双重检查(或三重检查),以确保强制转换按您期望的方式工作。

    int
    是通用整数类型。如果您需要整数,并且
    int
    满足您的要求(范围[-3276732767]),请使用它

    如果你有更专门的用途,那么你可以选择其他的。如果你需要数组中的索引,那么使用
    size\t
    。如果你需要向量中的索引,那么使用
    std::vector::size\u type
    。如果你需要特定的大小,那么从中选择一些内容。如果你需要大于64位的内容,那么找到一个库l艾克


    我想不出有什么好的理由使用
    无符号int
    。至少不能直接使用(
    size\t
    ,而且
    中一些特定大小的类型可能是
    无符号int
    的typedef)当值不能为负时,系统地使用
    无符号
    的问题不在于Java没有
    无符号
    ,而是带有无符号值的表达式,特别是当与有符号值混合时,如果将无符号视为带移位范围的整数类型,有时会产生令人困惑的结果一种模化类型,不限制整数为正或零

    因此,传统观点认为,当您需要模块化类型或进行位操作时,应使用
    无符号
    。该观点在K&R中是隐式的-看看int和无符号是如何使用的-在TC++PL中更为明确(第二版,第50页):

    unsigned
    整数类型非常适合将存储视为位数组的使用。使用
    unsigned
    而不是
    int
    多获取一个位来表示正整数几乎从来都不是一个好主意。通过声明变量
    unsigned
    来确保某些值是正的尝试通常会失败被隐式转换规则击败


    即使你的变量只能取无符号的非负值,这也是一个问题。下面是一个例子。假设一个程序员被要求编写一个代码,以0@H2CO3打印所有整数对(a,b):这就是例外情况。神奇的值是不好的。“如果无符号整数的值大于32767,则应使用无符号整数。”为什么?您也可以轻松地使用此参数“如果无符号整数的值大于32767,则应使用有符号整数。”。@BenjaminLindley:是的,那么?有符号字符的范围至少在-128到127之间,
    long
    的范围至少在-2147483647到2147483647之间。如果有符号整数的值大于32767没有意义,那么这与“使用有符号整数”有什么关系?@BenjaminLindley也许我不应该把讨论转移到其他整数类型上,但我的观点是OP对“必要”的定义似乎只与范围有关,而我认为应该首先考虑程序逻辑。@ BejayLimDyLy:如果我有一个程序来计算字符的读数,这可以是否定的吗?我可以有负数的苹果吗?我通常使用<代码>无符号< /代码>数量和大小。我从来没有遇到过负数的A。物理的东西。例如,一棵树的周长是负的吗?我让编译器h
    for (unsigned b = 0; b <= n; b++)
       for (unsigned a=0; a <=b-1; b++)
           cout << a << ',' << b << n ;