c - 与用 C 编写的二进制代码相关的程序结果存在问题

标签 c binary

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

#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;
}

最佳答案

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

另请注意,您不得访问超出范围的数组。 int bits[31]; 只有 bits[0]bits[30] 可用,因此再分配一个元素来使用 位[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;
}

更新:函数expoenteToBinario()mantissaToBinario()也是错误的:

  • 指数部分是 8 位长,而不是 7 位。
  • 如果值为零,则指数部分必须为零。
  • 您从未更新过 f,因此 mantissaToBinario() 中仅覆盖了符号位。
  • whileif 的条件相同,因此无法进行正确的转换。当 j 变为 1 或更大时,您还必须递减它。

更正的代码:

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.14300.14 的几乎正确的值,但最后一些数字是错误的。

该程序也不支持未标准化的数字。

关于c - 与用 C 编写的二进制代码相关的程序结果存在问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36143097/

相关文章:

list - 将 0-s 添加到列表中,直到它的长度在 Haskell 中为 8

binary - 如何在 Go 中将整数转换为二进制形式,反之亦然

c - 如何将二进制数组放入二进制文件

c - 如何使用c中的指针和函数打印存储在数组中的值

c - 多次调用 XML CharacterDataHandler 回调

c - openssl ssl_read 将读取的二进制数据发送到 char*

c - 以列方式从二进制矩阵获取 1 的索引

c - 如何在 Linux 中映射 Windows 共享 (LINUX) 下的文件?

mysql - 提交查询时出现段错误

c - 无法访问 C 中结构的值