2017-02-09 76 views
0

我想了解“有符号整数”和“算术左移”在swift和iOS中的工作原理。有符号整数,算术左移

在这本书中,迅速的编程语言3.0,它说

enter image description here

我试过了,用下面的代码:

enter image description here

我有符号整数了解,二进制表示-120是10001000,所以将一个地方移到左边将导致00010000,这等于16(如代码所示)。但是16不是-120的两倍

这本书所作的陈述是不正确的,对吧?或者有什么我失踪?

+2

这一切都取决于你正在使用什么类型的整数。尝试将'negative120'更改为Swift Integer而不是'Int8',就像'let negative120:Int = -120'一样,你会注意到这个值增加了一倍。 – Pierce

回答

2

您遇到整数溢出。只要所有位都有空间,倍增效果就会起作用。如果你使用Int16Int32Int64Int(映射要么Int32Int64,取决于系统)

这个例子会工作。考虑Int16的情况。

-120的二进制表示为Int161111 1111 1000 1000。左移一位,我们得到:1111 1111 0001 0000。这是您所期望的-240的二进制表示形式。下面是它的代码:

let a: Int16 = -120 
print(a << 1) 
+0

非常感谢您澄清这个概念。你能告诉我如何处理整数溢出时,我正在处理位?大多数时候,一切都很完美,但偶尔有一些边缘案例的结果不符合我们的预期。再次感谢你的帮助! – Thor

+0

@TonyStark嗯,这取决于。你究竟想达到什么目的? – Alexander

+0

我想我正在问一个非常普遍的问题。我没有特别的目的。只是想知道如何处理整体溢出,当我遇到他们我猜。抱歉不能更具体 – Thor