程序相关的问题与用C编写的二进制代码有关

时间:2016-03-21 22:50:40

标签: c binary

我一直在做一个程序,其中我需要打印一个int,1和0的数组,信号,浮动逗号...问题是,当我放一个负数时,循环是无限的,我的数组位没有给出正确的结果。请帮帮我!感谢。

#include <stdio.h>

float number;
int bits[31];
char sinal;
int expoente;
float mantissa;
int i;
int s;
float j;
int f;

void getSignal(float number){
    if(number < 0){
        sinal = '-';
        bits[0] = 1;
        number = number * -1; //passar a positivo p dpos dividir
    }
    else if(number > 0){
        sinal = '+';
        bits[0] = 0;
    }
}

//o numero de vezes q vo dividir o float ate dar um numero aceitavel p mantissa é o meu expoente, se for a dividir incrementa, etc...
void numberDivision(float number){
    while(number > 2){
        number = number/2;
        expoente++;
    }
    /*while(number < 1){
      number = number * 2;
      expoente--;
      }*/
    mantissa = number;
}

void expoenteToBinario(){ //i-127 = expoente  <=>  i = 127 + expoente  parto sempre do negativo
    i = 127+expoente;
    s = 7; //comeca a 7 p fzer a ordem ao contrario
    while(s >= 1){
        bits[s] = i%2; 
        s--;
        i = i/2;
    }
}

void mantissaToBinario(){
    if(mantissa < 2 && mantissa > 1){
        j = mantissa - 1;
    }
    while(j < 1){ 
        j = j * 2;
        if(j<1)
            bits[f] = 0;
        else 
            bits[f] = 1;
    }
}

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

int main(int argc, char *argv[]){
    scanf("%f", &number);
    getSignal(number);
    numberDivision(number);
    expoenteToBinario();
    mantissaToBinario();
    int x = 0;
    while(x<=31)
    {
        printf("%d", bits[x]);
        x++;
    }
    escreve_IEEE(sinal, expoente, mantissa);
    return 0;
}

1 个答案:

答案 0 :(得分:0)

在函数getSignal()numberDivision()中,您正在修改局部变量(参数),因此sugn否定不会影响全局变量。 虽然使用不必要的全局变量并不好,决定在此代码中使用它们,所以应该坚持下去并且重构应该在之后正确运作的是什么。

另请注意,您不得访问超出范围的数组。只有bits[0]bits[30]可用于int bits[31];,因此请再分配一个元素以使用bits[31]

试试这个:

#include <stdio.h>

float number;
int bits[32];
char sinal;
int expoente;
float mantissa;
int i;
int s;
float j;
int f;

void getSignal(){
    if(number < 0){
        sinal = '-';
        bits[0] = 1;
        number = number * -1; //passar a positivo p dpos dividir
    }
    else if(number > 0){
        sinal = '+';
        bits[0] = 0;
    }
}

//o numero de vezes q vo dividir o float ate dar um numero aceitavel p mantissa é o meu expoente, se for a dividir incrementa, etc...
void numberDivision(){
    while(number > 2){
        number = number/2;
        expoente++;
    }
    /*while(number < 1){
      number = number * 2;
      expoente--;
      }*/
    mantissa = number;
}

void expoenteToBinario(){ //i-127 = expoente  <=>  i = 127 + expoente  parto sempre do negativo
    i = 127+expoente;
    s = 7; //comeca a 7 p fzer a ordem ao contrario
    while(s >= 1){
        bits[s] = i%2; 
        s--;
        i = i/2;
    }
}

void mantissaToBinario(){
    if(mantissa < 2 && mantissa > 1){
        j = mantissa - 1;
    }
    while(j < 1){ 
        j = j * 2;
        if(j<1)
            bits[f] = 0;
        else 
            bits[f] = 1;
    }
}

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

int main(int argc, char *argv[]){
    scanf("%f", &number);
    getSignal();
    numberDivision();
    expoenteToBinario();
    mantissaToBinario();
    int x = 0;
    while(x<=31)
    {
        printf("%d", bits[x]);
        x++;
    }
    escreve_IEEE();
    return 0;
}

更新:[{1}}和expoenteToBinario()函数也有误:

  • 指数部分是8位长,而不是7位。
  • 如果值为零,则指数部分必须为零。
  • 您从未更新过mantissaToBinario(),因此只有符号位会被f覆盖。
  • mantissaToBinario()while的条件相同,因此无法进行正确的转化。此外,当它变为1或更多时,你必须递减if

更正后的代码:

j

使用此代码,我为输入void expoenteToBinario(){ //i-127 = expoente <=> i = 127 + expoente parto sempre do negativo i = 127+expoente; if(mantissa == 0) i = 0; s = 8; //comeca a 8 p fzer a ordem ao contrario while(s >= 1){ bits[s] = i%2; s--; i = i/2; } } void mantissaToBinario(){ if(mantissa < 2 && mantissa > 1){ j = mantissa - 1; } f = 9; while(f <= 31){ j = j * 2; if(j<1){ bits[f] = 0; }else{ bits[f] = 1; j -= 1; } f++; } } 3.14获得了几乎正确的值,但最后一些数字是错误的。

此程序也不支持未规范化的数字。