何时使用无符号值而不是有符号值(怎么办)?

时间:2015-04-21 04:59:26

标签: c++

何时在签名变量上使用无符号变量是否合适?在for循环中怎么样?

我听到很多关于此的意见,我想知道是否有任何类似的共识。

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

3 个答案:

答案 0 :(得分:2)

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

i < someThing.length();

即。你应该使用someThing.length()的确切类型。查看其签名并使用其返回类型作为本地变量i

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

答案 1 :(得分:0)

当值为负值时,您应该使用带符号的变量。

长度应始终为正,因此通常以unsigned类型表示。就标准库和其他大型库(例如,通常名为size_t)而言,这是我所能达成的共识。

最好对我使用unsigned int,因为如果长度很大,你就不会遇到溢出问题,但通常没有区别。

由于此问题,如果您将int(已签名)与unsigned int进行比较,许多编制器也会向您发出警告。

答案 2 :(得分:0)

显然,当涉及负数时,你应该使用带符号的类型 - 有趣的问题是,如果知道这个值是非负的,但是显然不需要等效无符号类型提供的额外范围。

没有一致意见。一些注意事项:

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

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

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

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

  • while (n-- >= 0)abs(a - b)等代码可能无法按照无符号类型执行操作,这是对签名类型具有一般偏好的一个原因