2017-02-09 1 views
0

J'essaie de comprendre comment "nombre entier signé" et "décalage gauche arithmétique" fonctionnent dans swift et iOS.Entier signé, décalage arithmétique vers la gauche

Dans le livre, le langage de programmation rapide 3.0, il dit

enter image description here

Je l'ai essayé avec le code suivant:

enter image description here

Je comprends avec entier signé, représentation binaire de -120 est 10001000, donc déplacer une place vers la gauche se traduirait par 00010000, ce qui est égal à 16 (comme indiqué par le code). Mais 16 n'est pas le double de -120

la déclaration faite par le livre est incorrecte, non? ou y a-t-il quelque chose qui me manque?

+2

Tout dépend du type d'entier que vous utilisez. Essayez de changer 'negative120' en un Integer Swift au lieu de' Int8' comme 'let negative120: Int = -120', et vous remarquerez que la valeur double. – Pierce

Répondre

2

Vous rencontrez un dépassement d'entier. L'effet de doublage ne fonctionne que tant qu'il y a de la place pour tous les bits.

Cet exemple fonctionnerait si vous utilisez Int16, Int32, Int64 ou Int (qui mappe soit Int32 ou Int64, en fonction du système). Considérons le cas de Int16.

La représentation binaire de -120 en tant que Int16 est 1111 1111 1000 1000. En décalant à gauche par un, nous obtenons: 1111 1111 0001 0000. Ceci est la représentation binaire pour -240, comme vous pouvez vous y attendre. Voici le code pour cela:

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

Merci beaucoup d'avoir clarifié le concept. Pourriez-vous s'il vous plaît me dire comment faire face à un débordement d'entier lorsque je travaille avec des bits? La plupart du temps, tout fonctionne parfaitement, mais il y a des cas marginaux occasionnels dont le résultat n'est pas ce que nous attendons. Merci encore pour votre aide! – Thor

+0

@TonyStark Eh bien cela dépend. Qu'essayez-vous exactement d'accomplir? – Alexander

+0

Je suppose que je pose une question très générale. Je n'ai pas de but particulier en tête. Je veux juste savoir comment faire face au débordement d'entier en général quand je les rencontre je suppose. Désolé, pas plus précis – Thor