我正在尝试创建一个算法,可以将基数为10的数字转换为基数为n的数字,其中n最多为10.但是,由于某些奇怪的原因,C中的以下算法在每个基数的某些关键点处失败。例如,对于基数2和基数3转换,分别包括1023和52,487的所有数字都可以工作,但超出该数字的数字会产生一些奇怪的负面结果。我无法弄清楚为什么会这样;有谁可以帮助我?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int returnint;
int baseconvert(int number,int base) {
if(number == 0 || base == 10) {
return returnint;
}
returnint = (number % base) + (10 * baseconvert(number / base, base));
return returnint;
}
int main() {
fprintf(stdout,"%d\n",baseconvert(1023,2));
fprintf(stdout,"%d\n",baseconvert(52487,3));
}
编辑:
以下是上述打印陈述的打印结果,如果有帮助的话:
1410065408
-2094967296
答案 0 :(得分:1)
您的算法在数字与基数范围内非常有限。基数越小,表示它的数字就越多。由于您以十进制形式存储结果,因此您将非常快速地浪费可用数据范围。没有基本数据类型可以保存所有可能输入的结果。例如,最大31位十进制数(正常整数,丢弃符号位)将导致31位输出!
您有几种方法可以解决这个问题:
#include <stdio.h>
void baseconvert(int number,int base)
{
if(number > 0)
{
int digit = (number % base);
baseconvert(number / base, base);
printf("%d",digit);
}
else
{
printf("\n");
}
}
int main()
{
baseconvert(1023,2);
baseconvert(52487,3);
}
答案 1 :(得分:0)
似乎整数值溢出。例如,基数2中的十进制值1023是1111111111.如果它是一个4字节的整数,那么当尝试&#34;添加&#34;再多一位(在这种情况下,最大有符号整数是2147483647)。
由于您的目标是在不同的基础上显示数字,因此将数字存储在字符数组中可能更有意义。
答案 2 :(得分:0)
在我所知道的所有处理器上,整数已经以二进制形式存储;这意味着基数2.这个值可以显示在你想要的任何基础上,你需要做一些工作。 printf()和朋友允许您轻松打印基数10(%d)和基数16(%x)。不难想象一种方法可以将二进制(基数2)整数值转换为基数n中的字符表示。
我严重怀疑你真的打算改变整数的实际值,正如你所做的那样。就像上面提到的@ThoAppelsin一样,无论您选择哪种基础进行展示,包中的苹果数量都保持不变。
通过简单地创建一个表示(用数字)任何基数中的整数的方法,你也可以解决溢出问题!
答案 3 :(得分:0)
您的结果溢出整数范围。请尝试使用字符串。这是伪代码,它依赖于字符串来表示数字,它可以将数字从任何基数转换为2到36之间的任何其他基数(使用数字和大写字母):
.d.ts
您可以在本文中找到完整的数学和实现:Converting Number Bases。