2016-03-21 11 views
-1

Ich muss einen Float zu IEEE (der Float wird durch eine scanf, und es muss von der scanf kommen, sonst wird es fallen und Fehler) und ich scheinen nicht zu bekommen es funktioniert. Ich habe versucht, argc und argv zu verwenden, und es war korrekt, aber meine einreichende Plattform hat es nicht akzeptiert, weil ich den Schwimmer durch einen Scan bekommen muss. Das Problem ist, da ich versuche, den Scan zu verwenden, wird es nicht die richtigen Bits drucken.Konvertieren Float in IEEE-Format in C

Der Ausgang für die Nummer 10 sollte sein:

Bits: 01000001001000000000000000000000

sinal: +

expoente: 3

Mantisse: 1,25000000

#include <stdio.h> 
#include <stdlib.h> 

typedef unsigned char Byte; 

int expoente; 
char sinal; 
float mant=1; 
int vector[32]; 
int vectorCounter=0; 
char number; 


void escreve_IEEE(char sinal, int expoente, float mant) 
{ 
    printf ("sinal: %c\n", sinal); 
    printf ("expoente: %d\n", expoente); 
    printf ("mantissa: %.8f\n", mant); 
} 

int expoenteBaseDois(int exp) 
{ 
    int result = 1; 
    int i = 0; 
    while (i < exp) { 
    result = 2 * result; 
    i++; 
    } 
    return result; 
} 

void conversion(Byte b[]) { 
    int i = 3; 
    int v; 
    int s; 
    while (i >= 0) { 
    v = b[i]; 
    s = 7; 
    while (s >= 0) { 
     vector[vectorCounter] = (v >> s) & 1; 
     vectorCounter++; 
     s--; 
    } 
    i--; 
    } 
    vectorCounter = 0; 
    if(vector[vectorCounter]==0) sinal='+'; 
    else sinal='-'; 
    vectorCounter++; 
    int exp = -127; 
    s = 7; 
    while (vectorCounter <= 8) { 
    exp = exp + vector[vectorCounter] * expoenteBaseDois(s); 
    s--; 
    vectorCounter++; 
    } 
    expoente = exp; 
    s = 1; 
    while (vectorCounter <= 31) { 
    mant = mant + vector[vectorCounter] * (1.0/(expoenteBaseDois(s))); 
    s++; 
    vectorCounter++; 
    } 

} 

int main(int argc, char *argv[]) { 
    float num; 
    scanf("%f", &num); 
    number= *(char*)&num; 
    conversion((Byte *) &number); 
    vectorCounter=0; 
    printf("bits: "); 
    while(vectorCounter>=0 && vectorCounter<32) 
    { 
    printf("%d",vector[vectorCounter]); 
    vectorCounter++; 
    } 
    printf("\n"); 
    escreve_IEEE(sinal, expoente, mant); 
    return 0; 
} 

Antwort

0

Sie können repariere deinen seltsamen Code, der das erste Mal verändert Haupt ructions:

float num; 
    scanf("%f", &num); 
// number= *(char*)&num; 
    conversion((Byte *) &num); 

In Ihrem Code sind vorbei Sie ein globales char Variable in die Konvertierungsfunktion, die ein 4 Bytes float Variable Adresse erwartet. Dann rufen Sie Ihren Code Undefined Behaviour auf.

Ausgang wird sein:

[email protected]:~/Test Folder$ ./test 
10 
bits: 01000001001000000000000000000000 
sinal: + 
expoente: 3 
mantissa: 1.25000000 
+0

ich das Guss gelöscht und es gibt mir immer noch die falsche Antwort: Bits: 00000000000000000000000000000000 sinal: + expoente: -127 Mantisse: 1,00000000 –

+0

@FranciscoCavalheiroCosta mit meiner Behebung ist die Ausgabe nicht korrekt. Übrigens ist Ihr Code abhängig von der Plattformendianess. – LPs

+0

Ich habe es falsch auf dem Terminal ausgeführt. Vielen Dank! –