swift - 使用有符号整数而不是无符号整数

标签 swift unsigned

<分区>

在软件开发中,利用编译器错误通常是个好主意。让编译器通过检查你的代码为你工作是有道理的。在强类型语言中,如果一个变量只有两个有效值,您可以将其设为 bool 值或为其定义一个枚举。 Swift 通过引入 Optional 类型进一步加强了这一点。

在我看来,这同样适用于无符号整数:如果您知道负值是不可能的,请以强制执行的方式进行编程。 我说的是高级 API;而不是负值通常用作隐蔽错误信号机制的低级 API。

还有苹果 suggests避免使用无符号整数:

Use UInt only when you specifically need an unsigned integer type with the same size as the platform’s native word size. If this is not the case, Int is preferred, even when the values to be stored are known to be non-negative. [...]

这是一个例子:Swift 的 Array.count返回一个 Int。一个人怎么可能有负数量的元素?!

为什么?!

Apple 声明:

A consistent use of Int for integer values aids code interoperability, avoids the need to convert between different number types, and matches integer type inference, as described in Type Safety and Type Inference.

但我不买账!使用 Int 不会比 UInt 更有助于“互操作性”,因为 Int 可以解析为 Int32 Int64(分别用于 32 位和 64 位平台)。


如果您完全关心稳健性,在没有逻辑意义的地方使用有符号整数本质上会强制进行额外检查(如果值为负怎么办?)

我看不出在有符号和无符号之间转换是微不足道的。这难道不是简单地指示编译器将机器代码解析为使用有符号或无符号字节码吗?!

最佳答案

  1. 在有符号和无符号整数之间来回转换,一方面极易出错,而另一方面几乎没有任何值(value)。

  2. 您建议使用 unsigned int 的一个原因是隐式保证索引永远不会获得负值..好吧,这有点推测。获得负值的可能性从何而来?当然,来自代码,即来自静态值或来自计算。但在这两种情况下,对于 be able 为负数的静态值或计算值,它们必须作为有符号整数处理。因此,每次将有符号值分配给无符号变量(反之亦然)时,引入各种检查是语言实现的责任。这意味着我们谈论的不是被迫“做额外检查”或不做,而是每次我们懒得理会极端情况时,语言都会隐式地为我们做这个检查。

  3. 从概念上讲,有符号和无符号整数从低级别(机器代码)进入语言。换句话说,无符号整数出现在该语言中并不是因为它是有需要的语言,而是因为它可以直接桥接至机器指令,因此仅出于 native 就可以提高性能。背后没有其他重要原因。因此,如果人们只是对可移植性一瞥,那么人们会说“是 Int,就是这样。让开发人员编写干净的代码,剩下的交给我们”。

关于swift - 使用有符号整数而不是无符号整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28798148/

相关文章:

ios - Swift MapView -> 以编程方式启动 "didSelectAnnotation"与用手指点击注释不同

Swift - Unwind segue 传回零值?

json - 如何将图像添加到服务器上现有的图像数组中? Xcode

java - 为什么 Java 不支持无符号整数?

来自字符串的 C++ 整数

c - 无符号溢出与 C 中的模数运算符

ios - 无法将项目添加到 UIView xib 中的 UICollectionView

ios - RxSwift - PublishSubject 上的发射顺序

java - TEA算法java实现和32位无符号位问题

java - Java 可以对一般范围内测试使用无符号比较吗?