Droit déplaçant les nombres négatifs en C
J'ai un code C dans que je ne le suit.
int nPosVal = +0xFFFF; //+ Added for ease of understanding
int nNegVal = -0xFFFF; //- Added for valid reason
Maintenant, quand j'essaie
printf ("%d %d", nPosVal >> 1, nNegVal >> 1);
- Je obtenir
32767 -32768
Est-ce prévu?
Je suis capable de penser quelque chose comme
65535 >> 1 = (int) 32767.5 = 32767
-65535 >> 1 = (int) -32767.5 = -32768
Qui est, -32767.5 est arrondi à l'-32768.
Est cette compréhension correcte?
- Droit de décalage de bits fonctionne comme "parqueté de la division". Il arrondit toujours vers l'infini négatif. Dans la syntaxe de Python:
-5 // 4 = -2
.
Vous devez vous connecter pour publier un commentaire.
Il ressemble à la mise en œuvre est sans doute une arithmétique de décalage de bits avec en complément à deux chiffres. Dans ce système, il décale tous les bits vers la droite, puis remplit les bits de poids avec une copie de ce que le dernier morceau a été. Donc pour ton exemple, le traitement de l'int sur 32 bits ici:
Après la maj, vous avez:
Si vous convertissez ce retour à la virgule, vous obtenez 32767 -32768 et respectivement.
Effectivement, un décalage à droite des tours vers l'infini négatif.
Edit: Selon la Section 6.5.7 de la dernière projet de norme, ce comportement sur les nombres négatifs est dépendant de l'implémentation:
Leurs rationnelle pour cela:
Il est donc dépendant de l'implémentation de la théorie. Dans la pratique, je n'ai jamais vu une mise en œuvre pas faire un décalage à droite lorsque l'opérande de gauche est signé.
Non, vous n'obtenez pas des nombres fractionnaires comme 0,5 lorsque l'on travaille avec des entiers. Les résultats peuvent être facilement expliqué quand vous regardez les représentations binaires de deux nombres:
Le décalage de bits vers la droite un peu, et s'étendant à gauche (à noter que cette mise en œuvre est la personne à charge, grâce Trent):
Reconvertir en décimal:
1
. Qui n'est pas négatif, et il n'est ni >= la largeur d'unint
.La C les spécifications ne précise pas si le bit de signe est décalé ou pas. Il est dépendant de l'implémentation.
Lorsque vous le déplacement à droite, le moins significatif-bit est mis au rebut.
0xFFFF = 0 1111 1111 1111 1111, le droit des changements à donner 0 0111 1111 1111 1111 = 0x7FFF
-0xFFFF = 1 0000 0000 0000 0001 (2s compléter), le droit des changements à 1 1000 0000 0000 0000 = -0x8000
A-1: Oui. 0xffff >> 1 est 0x7fff ou 32767. Je ne suis pas sûr de ce qu'-0xffff n'. C'est étrange.
A-2: le Décalage n'est pas la même chose que de se diviser. C'est le décalage de bits—une primitive opération binaire. Qu'il peut parfois être utilisé pour certains types de division est pratique, mais pas toujours le même.
- 0xFFFF
nie0xFFFF
. C'est en fait égal à(~ 0xFFFF)-1
, interprété comme un entier signé.Sous le niveau C, les machines ont un cœur de PROCESSEUR qui est entièrement entier ou scalaire. Bien que ces jours, tous les CPU de bureau a un FPU, ce n'était pas toujours le cas et aujourd'hui encore, les systèmes embarqués sont fait sans instructions en virgule flottante.
Aujourd'hui paradigmes de programmation et de CPU dessins et modèles et les langues date de l'époque où la FPU pourrait même ne pas exister.
Donc, mettre en œuvre des instructions du PROCESSEUR point fixe opérations de, généralement considérés comme purement entier ops. Seulement si un programme déclare éléments de float ou double sera tout de fractions existent. (Eh bien, vous pouvez utiliser le PROCESSEUR de la fpo pour "point fixe" avec les fractions, mais qui est maintenant et à toujours était assez rare.)
Indépendamment de ce qui était requis par la norme de langage comité d'années, toutes les machines de propager le bit de signe sur le droit des quarts de nombres signés. Droit des changements de valeurs non signées changement de zéros sur la gauche. Les bits décalé sur la droite sont tombées sur le sol.
D'approfondir vos connaissances il vous faudra enquêter "deux-en complément de l'arithmétique".
x >> 1
, en C, un nombre négatif en positif.