我一直在做一个程序,其中我需要打印一个 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()
中仅覆盖了符号位。 while
和if
的条件相同,因此无法进行正确的转换。当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.14
和 300.14
的几乎正确的值,但最后一些数字是错误的。
该程序也不支持未标准化的数字。
关于c - 与用 C 编写的二进制代码相关的程序结果存在问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36143097/