2016-03-21 7 views
-1

Мне нужно преобразовать float в IEEE (float задается scanf, и он должен исходить из scanf, иначе он будет падать и ошибка), и я, похоже, не получаю это работать. Я попытался использовать argc и argv, и это было правильно, но моя подающая платформа не приняла его, потому что мне нужно получить поплавок при сканировании. Проблема в том, что я пытаюсь использовать сканирование, оно не будет печатать правильные биты.Преобразование float в формат IEEE в C

Выход за номером 10 должно быть:

биты: 01000001001000000000000000000000

Sinal +

expoente: 3

мантиссы: 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; 
} 

ответ

0

Вы можете исправить свой странный код, модифицирующий первый inst от волнения главный:

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

В своем коде вы передаете глобальную char переменную в функции преобразования, ожидающий 4 байт всплывают адрес переменной. Затем ваш код вызывает Undefined Behaviour.

выход будет:

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

Я удалил этот бросок, и он по-прежнему дает мне неправильный ответ: биты: 00000000000000000000000000000000 SINAL: + expoente: -127 мантиссы: 1.00000000 –

+0

@FranciscoCavalheiroCosta с моим исправлением выход является эффективным. Кстати, ваш код зависит от платформы. – LPs

+0

Я неправильно использовал его на терминале. Большое спасибо! –

Смежные вопросы