2017-02-09 51 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

Вы испытываете переполнение целых чисел. Эффект удвоения работает только до тех пор, пока есть место для всех бит.

Этот пример будет работать, если вы используете Int16, Int32, Int64 или Int (отображающая либо Int32 или Int64, в зависимости от системы). Рассмотрим случай Int16.

-120 двоичное представление как Int16 является 1111 1111 1000 1000. Слева сдвигая на один, получаем: 1111 1111 0001 0000. Это двоичное представление для -240, как и следовало ожидать. Вот код для этого:

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

Большое спасибо за разъяснение концепции. Не могли бы вы рассказать мне, как бороться с переполнением целого числа, когда я работаю с битами? В большинстве случаев все работает отлично, но есть случайные краевые случаи, результатом которых является не то, что мы ожидаем. В очередной раз благодарим за помощь! – Thor

+0

@TonyStark Ну, это зависит. Что именно вы пытаетесь достичь? – Alexander

+0

Наверное, я задаю очень общий вопрос. У меня нет особой цели. Просто хочу знать, как бороться с переполнением целого в целом, когда я сталкиваюсь с ними, я думаю. Извините, не может быть более конкретным – Thor