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

时间:2015-03-01 19:38:50

标签: swift unsigned

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

在我看来,同样适用于无符号整数:如果你知道负值是不可能的,那么以强制它的方式编程。 我在谈论高级API;而不是低级API,其中负值通常用作神秘的错误信号机制。

然而Apple suggests避免使用无符号整数:

  

仅当您特别需要与平台的本机字大小相同的无符号整数类型时才使用UInt。如果不是这种情况,则Int是首选,即使已知要存储的值是非负的。 [...]

以下是一个例子:Swift的Array.count返回Int。怎么可能有负数量的物品?!

为什么?!

苹果公司表示:

  

Int对整数值的一致使用有助于代码互操作性,避免了在不同数字类型之间进行转换,并匹配整数类型推断,如Type Safety and Type Inference中所述。

但我不买它!使用Int无法提供互操作性"自UInt可以解析为IntInt32(分别针对32位和64位平台)之后的Int64以上。


如果你完全关心健壮性,那么使用有符号整数,它没有任何逻辑意义,实际上强制进行额外的检查(如果值为负,该怎么办?)

我无法看到签名和未签名之间的行为,除了微不足道之外。这不是简单地指示编译器解析机器代码以使用有符号或无符号字节代码吗?!

3 个答案:

答案 0 :(得分:0)

  1. 在签名和无符号整数之间来回转换,一方面容易出错,另一方面却没有什么价值。

  2. 你建议使用unsigned int的一个原因是隐含的保证索引永远不会得到负值..好吧,它有点推测。获得负值的可能性来自哪里?当然,从代码中,即从静态值或从计算中获取。但在这两种情况下,对于静态或计算值, 得到否定,它们必须作为有符号整数处理。因此,每次将有符号变量赋值给无符号变量时(或反之亦然),引入各种检查是语言实现的责任。这意味着我们谈论的不是被强迫进行额外的检查"或者不是,但是每当我们懒得打扰角落的情况时,我都会用语言暗示这个检查。

  3. 从概念上讲,有符号和无符号整数从低级别(机器代码)进入语言。换句话说,无符号整数在语言中不是因为它是有需要的语言,而是因为它可以直接桥接到机器指令,因此只是为了原生而获得性能提升。背后没有其他重大原因。因此,如果一个人只是想到了可移植性,那么就会说" Be it Int,就是这样。让开发人员编写干净的代码,我们将剩下的代码带到#34;。

答案 1 :(得分:0)

只要我们有基于意见的问题......

基于机器寄存器大小的编程语言数学运算是计算机科学的一大悲剧。应该有Integer *,Rational,Real和Complex - 完成和撒粉。某些设备驱动程序需要映射到U8寄存器的东西吗?称之为RegisterOfU8Data - 或其他 - 只是'Int(eger)'

*当然,将其称为“整数”意味着它“滚动”到无限范围,即BigNum。

答案 2 :(得分:0)

分享我发现的哪些间接帮助我理解......至少部分。也许它最终会帮助别人?!

经过几天的挖掘和思考,似乎我的问题的一部分归结为使用“#strong> "

这个词。

早在我记忆中,我就被告知强制转换与以下方面的转换非常不同且不同:

  • 转换保留了含义,但更改了数据。
  • Casting 保留了数据但改变了含义。

Casting是一种机制,允许您通知编译器它和您将如何操作某些数据(不更改数据,因此无需成本)。 " 我对编译器:好的!最初我告诉你这个字节是一个数字,因为我想对它进行数学运算。现在,我们将其视为ASCII字符。"

转换是一种将数据转换为不同格式的机制。 " 我对编译器:我有这个号码,请生成一个表示该值的ASCII字符串。"


我的问题似乎是,在Swift(很可能是其他语言)中,转换和转换之间的界限很模糊......

例如,Apple explains表示:

  

Swift中的类型转换是使用isas运算符实现的。 [...]

var x: Int = 5
var y: UInt = x as UInt   // Casting... Compiler refuses claiming 
                          // it's not "convertible".
                          // I don't want to convert it, I want to cast it.

如果"铸造"是不是这个明确定义的行动,它可以解释为什么无人符号的整数应该像瘟疫一样被避免...