2015-04-07 41 views
0

我很新的C,我試圖理解這個代碼,但是有一些東西我不明白,比如參數Byte data[],我不明白是什麼傳遞給函數(Byte *) &i。 我會很感激任何幫助,謝謝。C程序設計IEEE 754小數二進制轉換器

代碼:

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

typedef unsigned char Byte; 

void showsignal(char str[], Byte data[], int size) { 
    int i,j; 

    printf ("%s: ", str); 
    for (i = size-1; i> size-2; i--) { 
     for (j = 1; j > 0; j--) { 
      int bit = (data[i] >> j) & 1; 
      printf ("%d", bit); 
     } 
    } 
    printf ("n"); 
} 

void showexponent(char str[], Byte data[], int size) { 
    int i,j; 

    printf ("%s: ", str); 
    for (i = size-2; i>size-3; i--) { 
     for (j = 7; j >= 0; j--) { 
      int bit = (data[i] >> j) & 1; 
      printf ("%d", bit); 
     } 
    } 
    printf ("n"); 
} 

void showsignificand(char str[], Byte data[], int size) { 
    int i,j; 

    printf ("%s: ", str); 
    for (i = size-3; i>size-4 ; i--) { 
     for (j = 23; j > 0; j--) { 
      int bit = (data[i] >> j) & 1; 
      printf ("%d", bit); 
     } 
    } 
    printf ("n"); 
} 

int main(int argc, char *argv[]) { 
    float f; 
    int i; 

    f = atof(argv[1]); 
    i = trunc(f); 
    if (f-i == 0) { 
     showsignal("sinal", (Byte *) &i, sizeof(i)); 
     showexponent("expoente", (Byte *) &i, sizeof(i)); 
     showsignificand("mantissa", (Byte *) &i, sizeof(i)); 
    } else { 
     showsignal("sinal", (Byte *) &f, sizeof(f)); 
     showexponent("expoente", (Byte *) &f, sizeof(f)); 
     showsignificand("mantissa", (Byte *) &f, sizeof(f)); 
    } 

    return 0; 
} 
+0

請您能夠直接在問題的引擎收錄代碼? –

回答

0

showsignal("signal", (Byte *) &i, sizeof(i)); 

意味着我們調用函數showsignal並將它傳遞3個參數。

第一個參數是一個字符串「信號」,這是簡單的。

第二個參數是有點複雜。 &我得到你的變量我的地址,然後我們將該地址轉換爲一個字節指針。因爲函數需要一個指向字節的指針,所以我們不能只發送一個整數的地址。這就是爲什麼我們必須將它轉換爲Byte指針。

0

這個函數有你查詢的參數,Byte data[],這是一個指針爲unsigned char的數組:

void showsignal(char str[], Byte data[], int size) { 

它顯示了陣列中的二進制和從main()稱爲這樣的:

int main(int argc, char *argv[]) { 
    float f; 
    int i; 
    f = atof(argv[1]); 
    i = trunc(f); 
    if (f-i == 0) { 
     showsignal("sinal", (Byte *) &i, sizeof(i)); 

的代碼輸入一個號碼float f並將其轉換爲int i。然後它將int傳遞給該函數,方法是將其轉換爲無符號字節的數組。該功能然後以二進制打印它。由於sizeof(i)i的字節數,它知道它傳遞的數組長度。

因爲編譯器不會接受int作爲參數unsigned char*,因此需要強制轉換。因此,程序記錄器採取了int的地址與&i,使用(Byte *) &i,則該功能可以把它當作一個數組中的二進制位打印它轉換爲unsigned char*指針。

相關問題