【问题标题】:When to use unsigned values over signed ones (how do)?何时使用无符号值而不是有符号值(如何)?
【发布时间】:2015-04-21 04:59:25
【问题描述】:

什么时候适合使用无符号变量而不是有符号变量?在 for 循环中呢?

我听到了很多关于这个的意见,我想看看是否有任何类似的共识。

for (unsigned int i = 0; i < someThing.length(); i++) {  
    SomeThing var = someThing.at(i);  
    // You get the idea.   }

【问题讨论】:

标签: c++


【解决方案1】:

在您的具体情况下,您应该在此表达式中使用生成隐式类型转换的类型:

i < someThing.length();

即您应该使用someThing.length() 的确切类型。查看其签名并将其返回类型用于您的局部变量 i

不要将循环变量视为特殊的东西。如果您使用的是length,请使用length 的类型。尽量在项目中保持一致,避免不必要的类型转换。

【讨论】:

    【解决方案2】:

    当值可以为负时,您应该使用有符号变量。

    长度应始终为正数,因此通常用unsigned 类型表示。这是我在标准库和其他大型库中看到的共识(例如,通常命名为size_t)。

    最好使用unsigned int for i,因为如果长度很大,您不会出现溢出问题,但通常没有区别。

    如果您将int(已签名)与unsigned int 进行比较,许多编译器也会因为此问题而发出警告。

    【讨论】:

    • 对于数组索引或任何受内存空间限制的内容,请使用size_t,而不是unsigned int,尽管这确实会导致 64 位平台上的内存效率低下。
    • 我想说人们通常知道最大索引值是小(可能是几千)还是大。需要分配 64 位索引的情况非常少见,除非您有无限的内存,否则您应该知道何时会发生这种情况。我只关注有符号与无符号,数组索引的大小很少有问题。
    • 假设字对齐,uint32_t 使用的有效内存空间将与 x64 上的size_t 相同。
    【解决方案3】:

    显然,当涉及到负数时,您应该使用有符号类型 - 有趣的问题是,当已知该值是非负数但显然不需要额外范围的等效无符号类型时,这样做是否仍然很好优惠。

    没有共识。一些注意事项:

    • 某些变量的实际导入本身是有符号的(例如一个人的年龄),无符号变量可以对其进行编码/传达给阅读源代码的程序员

    • 我不知道任何编译器会在您将无符号类型传递给期望有符号的函数时发出警告,反之亦然;声称类型的选择可以强制执行正确性是可疑的

    • 如果比较有符号和无符号类型,许多编译器都会发出警告

    • 库中的某些特定变量/类型要么是有符号的,要么是无符号的,对与之交互的变量使用相同的类型可能是有意义的,以确保可表示的范围相同

    • while (n-- &gt;= 0)abs(a - b) 之类的代码在给定无符号类型的情况下可能无法满足需要,这是普遍偏爱有符号类型的原因之一

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-11
      • 1970-01-01
      • 2012-10-02
      • 2021-09-16
      • 2017-03-09
      • 2011-03-08
      • 2015-10-31
      相关资源
      最近更新 更多