2011-05-19 16 views
2

J'ai créé le programme suivant pour trouver le modèle binaire du nombre à virgule flottante. mais je suis différent alors je calcule:Représentation à virgule flottante IEEE

#include<stdio.h> 

int main(void){ 
    float f = 1.234; 
    char *ch; 
    ch = (char *)(&f); 
    printf("\n%d\n", *ch); 
    ch++; 
    printf("\n%d\n", *ch); 
    ch++; 
    printf("\n%d\n", *ch); 
    ch++; 
    printf("\n%d\n", *ch); 

// printf("%d %d %d %d", *ch, *(ch+1), *(ch+2), *(ch+3)); 
    printf("\n%f %e", f, f); 
    return 0; 
} 

Il me donne une sortie:

-74 

-13 

-99 

63 

1.234000 1.234000e+00 

Qu'est-ce que cela veut dire parce que je me attendais modèle binaire comme:

00111111 10111011 11100111 0110110

où i je me trompe s'il vous plaît corrigez-moi

+1

Pourquoi vous attendiez-vous que motif de bits? –

Répondre

4

Je ne suis pas sûr d'où vous avez obtenu ce modèle de bits.

Pour IEEE-754, 1.234 est équivalent à une représentation sous-jacente de 0x3F9DF3B6 (voir par exemple http://babbage.cs.qc.edu/IEEE-754/Decimal.html). Nous avons donc:

0x3F = 00111111 = 63 
0x9D = 10011101 = -99 (as a signed char) 
0xF3 = 11110011 = -13 
0xB6 = 10110110 = -74 

En fonction de votre système boutisme, vous trouverez peut-être que ces octets sont dans l'autre ordre.

1

Il n'y a pas de corbeille ary printf format intégré dans la norme C. Vous aurez besoin d'écrire votre propre si c'est le format de sortie que vous voulez. Vous pouvez vous rapprocher en utilisant %x pour voir la sortie hexadécimale; peut-être que cela vous obtiendra ce dont vous avez besoin?

+0

OP doit également utiliser 'unsigned char' plutôt que' char'. –

0

Le modèle binaire que vous attendez est mauvais, il devrait être:

{"00111111", "10011101", "11110011", "10110110"} = {63, -99, -13, -74} 

qui produit exactement les chiffres que vous avez obtenu.

Le signe, exposant et significatif sont: 0, 127, 1962934

Questions connexes