2 votes

Décalage à gauche magique

J'ai du code :

signed short a = -32740;
float c;
float b;
b = (signed short)(a << 4);
c = a << 4;
printf("(signed short)(a << 4): %f\n", b);
printf("(a << 4): %f\n", c);

sortie :

(signed short)(a << 4): 448.000000
(a << 4): -523840.000000

Pourquoi 16 registres seniors ne sont-ils pas réinitialisés après le décalage (c = a << 4;) ?

Le programme a été exécuté sur une machine x86 avec un système linux 32 bits.

5voto

Nils Pipenbrinck Points 41006

b = (signed short)(a << 4);

Cette ligne fait ce qui suit:

  1. Calculer (a << 4). Le calcul est effectué avec des entiers (par défaut en C). Le résultat est: -523840
  2. Tronquer le résultat (en abandonnant des bits) à 16 bits en le convertissant en signed short. (le résultat est 448)
  3. convertir le résultat en float (pas de changement de valeur)

c = a << 4;

Cette ligne fait ce qui suit:

  1. Calculer (a << 4). Le calcul est effectué avec des entiers (par défaut en C). Le résultat est: -523840
  2. convertir le résultat en float (pas de changement de valeur)

Le fait que 'a' soit déclaré comme un signed short ne fait pas de différence car tous les calculs sont toujours effectués avec le type de données int. Je suppose que votre système a des entiers de 32 bits.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X