2010-07-20 5 views
3

je le code suivantPourquoi ce code entraîne-t-il 0?

#include <stdio.h> 
#include <iostream> 
#include <stdlib.h> 
#include <stdint.h> 
using namespace std; 
int main(){ 
    int x; 
    cin>>x; 
    uint32_t Ex; 
    Ex=(x<<1)>>24; 
    cout<<Ex<<endl; 
    return 0; 
} 

mais il donne 0 pour une valeur de x?

Ma tâche est la suivante:

Computation of the biased exponent Ex of a binary32 datum x. 
+0

Quelles sont vos entrées? Avez-vous essayé tous les numéros? Quels cas de bord avez-vous essayé? Le code multiplie en réalité x par 2 puis divise le résultat par 2^24. Il faudrait donc que ce soit relativement grand pour être nul. Mais tout nombre supérieur à 2^23 et beaucoup de nombres négatifs ne devraient renvoyer aucun zéro. Notez que c'est une supposition éclairée car je n'ai pas de crayon et de papier à vérifier –

Répondre

2

Il n'est pas tant que vous obtenez zéro pour « une valeur de x », mais que vous obtenez zéro pour une valeur positive de x plus petit que 0x01000000 (ce qui est 16777216). Rien de tout cela n'aide beaucoup à expliquer un «exposant biaisé d'une donnée binaire32». Cela ressemble à l'exposant d'un nombre à virgule flottante de 32 bits (IEEE). Vous devez probablement vous soucier de l'endianness de la représentation, entre autres choses.

1

Vous obtenez zéro parce que vous avez correctement décalé 24 bits, ce qui déplace vos bits significatifs de la fin et les remplace par des zéros de gauche.