我一直在做一个程序,其中我需要打印一个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;
}
答案 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()
函数也有误:
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
获得了几乎正确的值,但最后一些数字是错误的。
此程序也不支持未规范化的数字。