2016-03-21 21 views
-1

floatをIEEEに変換する必要があります(floatはscanfで与えられ、それ以外の場合はscanfから来なければなりません)。それは機能する。私はargcとargvを使ってみましたが、それは正しいですが、私の提出するプラットフォームは、スキャンでフロートを取得する必要があるため、受け付けませんでした。問題は、スキャンを使用しようとしているため、正しいビットが印刷されないためです。floatをIEEE形式に変換する

番号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

ことができますあなたの奇妙なコードを修正してfirst instを修正するメインのructions:あなたのコードで

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

あなたは4バイトが変数のアドレスをフロート期待する変換関数にグローバルchar変数を渡しています。次にコードで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

私は端末でそれを間違って実行していました。どうもありがとうございました! –

関連する問題