【发布时间】:2022-08-16 08:27:05
【问题描述】:
所以我试图使用 c 将十进制数转换为二进制数。在这段代码中,每件事似乎都运行良好。此代码也适用于 32、33 和继续的小数。但是此代码不适用于 0 到 31 的小数。这里有什么错误。
#include <stdio.h>
#include <math.h>
int main(void)
{
int decimal;
printf(\"Enter the decimal value: \");
scanf(\"%i\", &decimal);
int n, remainder;
int i, j, k;
for (int i = 0; i < decimal; i++)
{
if (pow(2, i) <= decimal)
{
n = i;
}
}
char index[n];
int quotient[n];
quotient[0] = decimal;
for (i = 0; i <= n; i++)
{
quotient[i + 1] = quotient[i] / 2;
remainder = quotient[i] % 2;
if (remainder == 1)
{
index[i] = \'1\';
}
else
{
index[i] = \'0\';
}
}
for (int k = n; k >= 0; k--)
{
printf(\"%c\", index[k]);
}
return 0;
}
-
除了其他事情,当\'i\' 达到\'n\' 的值时
quotient[i + 1] = quotient[i] / 2;会发生什么? -
在带有内存清理器/检查的调试器中运行代码可能会提供大量信息。请注意,对于 32 及以上的值,它不会“工作”。您只是认为确实如此,因为有时会调用未定义的行为似乎“工作”。 See here。
-
decimal不是十进制int 是一个int。十进制值的表示是 bt 提供的表示函数,例如printf。int已经是二进制因为这就是计算机代表的方式全部对象,与类型无关。因此,您的“转换”是不必要的并且过于复杂 - 您可以简单地使用“行走 1”位掩码来检查和呈现各个位。 -
此外,您还有一种相当复杂的方法来确定有效位数。 Fe2O3 的答案是明智的解决方案,但如果你必须用算术计算,那么
int n = ceil( log( decimal ) / log( 2 ) ) ;