十进制转化为十六进制输入整数大于等于2^32的问题,如何解决?

孙老师的小迷弟 2019-01-12 04:16:11
烦请各位大佬指导一下我这个漏洞怎么解决?
我是用char类型的数组存储转换后的十六进制数字,然而当输入的数据过大
如输入:2^32或2^31 输出的结果是这样子。



很想知道大家是如何处理这种问题的。
下面是我的代码

//将十进制整数转化为16进制
#include <stdio.h>
#define MAXSIZE 100+10
#define BASE 16
int main(){
int n,base,temp;
int i=0;
char array[MAXSIZE];
printf("请输入要转化的整数:\n");
scanf("%d",&n);

do{
temp=n%BASE;
if(temp<10) //算法的核心:让这个数一直除以2,保留余数,直到商为0,倒序输出余数
array[i]='0'+temp;
else
array[i]='A'+temp-10;
n=n/BASE;
i++;
}while(n!=0);

printf("\n");
printf("\n");
printf("转换后的16进制数为:\n");
for(int j=i-1;j>=0;j--){ //倒序打印
printf("%c",array[j]);
}
return 0;
}















...全文
198 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
threenewbee 2019-01-13
  • 打赏
  • 举报
回复
用long,再不行用long long,再不行,字符串模拟大数计算。
lin5161678 2019-01-13
  • 打赏
  • 举报
回复
引用 1 楼 独孤由过 的回复:
任意进制之间的相互转换

#include<iostream>

char hex[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };

int hexConversion(char *str, char *istr, int x, int n)
{
int sum = 0, lengh = strlen(str);
for (int i = lengh - 1; i >= 0; --i)
for (int j = 0; j < 16; ++j)
if (str[i] == hex[j])
sum += j*pow(x, lengh - i - 1);
int count = 0;
do
{
istr[count] = hex[sum%n];
sum /= n;
++count;
} while (sum != 0);
return count;
}

int main()
{
char str[100], istr[100];
int x, n;
std::cout << "输入数和进制:";
std::cin >> str >> x;
std::cout << "输入转换的进制:";
std::cin >> n;
int count = hexConversion(str, istr, x, n);
std::cout << "结果为:";
for (int i = count - 1; i >= 0; --i)
std::cout << istr[i];
return 0;
}
你都没看题主遇到的问题是什么
怎么转换题主知道并且代码都写出来了
题主的问题是 溢出
如果数据 超过int的取值范围 代码结果错
想知道怎么处理
而你的代码 会出现和题主一样的问题
解决的是题主并不关心的任意进制转换到任意进制

另外2个问题
1. pow没写头文件
2. 任意进制转十进制的时候从后往前计算又掉low 从前往后计算方便多了

赵4老师 2019-01-13
  • 打赏
  • 举报
回复
char * __cdecl _ui64toa(unsigned __int64, char *, int);
独孤过 2019-01-12
  • 打赏
  • 举报
回复
任意进制之间的相互转换

#include<iostream>

char hex[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };

int hexConversion(char *str, char *istr, int x, int n)
{
	int sum = 0, lengh = strlen(str);
	for (int i = lengh - 1; i >= 0; --i)
	for (int j = 0; j < 16; ++j)
	if (str[i] == hex[j])
		sum += j*pow(x, lengh - i - 1);
	int count = 0;
	do
	{
		istr[count] = hex[sum%n];
		sum /= n;
		++count;
	} while (sum != 0);
	return count;
}

int main()
{
	char str[100], istr[100];
	int x, n;
	std::cout << "输入数和进制:";
	std::cin >> str >> x;
	std::cout << "输入转换的进制:";
	std::cin >> n;
	int count = hexConversion(str, istr, x, n);
	std::cout << "结果为:";
	for (int i = count - 1; i >= 0; --i)
		std::cout << istr[i];
	return 0;
}
第一题R010E 1.问题描述:将一个正整数n(长整型)输出成"千分位"形式,即从个位数起,每三 位之间加一个逗号,例如,将7654321输出成7,654,321。 2.课题分析:如果数小于一千,则不用转换,如果大于一千则要,也就是一个数除以 一千,取整,在整数后面加一个逗号后再写上余数。考察的C语言知识是关于取整取余 及字符,判断等内容的运用。 3.数据结构的设计: char c=','; // 千分位的符号 int n, //输入的数 int a[100]//存储用千分位表示的数 if(n<1000) // 比较输入的数是否大于一千 printf("%d",n); //如果输入的数小于一千,则直接输出 else { for(i=0;n>=1000;i++) { a[i]=n%1000; //取余 n/=1000; //取整数 j=i+1; } a[j]=n; for(i=j;i>0;i--)// 循环运行直到条件不符合 { printf("%d%c",a[i],c); } printf("%d",a[0]); //输出 } 4.处理结构的设计: 5.源程序: #include void main() { char c=','; int n,i=0,j=0,a[100]; printf("请输入一个正整数n:\n"); scanf("%d",&n); if(n<1000) printf("%d",n); //如果输入的数小于一千,则直接输出 else { for(i=0;n>=1000;i++) { a[i]=n%1000; //取余 n/=1000; //取整数 j=i+1; } a[j]=n; for(i=j;i>0;i--) { printf("%d%c",a[i],c); } printf("%d",a[0]); } printf("\n"); } 6.调试记录: 第二题P007M 1. 问题描述:编制不同数制间的转换程序。要求提供输入输出界面,当输完一个任意十进 制数字,程序能自动将其转化为另外的数制表示的值,包括二进制、八进制和十六进 制,其中转化用算法实现,而不是用printf函数显示。 2.课题分析:将十进制数转换为其他进制的数,其算法是以将被换为的进制数作 为除数,从给出的数起依次作除求余,直至整除后结果为零,然后将运算中所得的余数 按倒序排列即得到数制转换后所得的数。 在定义数组时需要注意到无符号长整型数的取值范围,提供足够但有效地数组长度 。 转换为二进制的数与转换为八进制的数的算法基本一致,即依次记下求余所得,并 判断整除后是否为零决定是否继续运算,而转换为十六进制的数时前十个为数字表示, 而后面六个数为用大写的'A'~'F'表示。 3.数据结构的设计:unsigned long a,temp;//存储所要转换的数和整除后的数 char b[64];//存储二进制数的数组 char o[21];// 存储八进制数的数组 char h[16];// 存储十六进制数的数组 在此,所定义的三个数组的长度即分别有效地考虑到无符号长整型数的取值范围 b[i]=temp%2+'0';//求余;强制类型转换为实数 temp/=2;//整除运算 在此需根据temp的值判断是否运算完毕 while(i>=0) {printf("%c",b[i]); i--;//从后向前依次输出while(temp&&i<16) { int x=temp%16; if(x<10) h[i]=x+'0'; else h[i]=x-10+'A';//前十个为数字,后六个为字母 temp/=16; i++; } int m=1; while(m) {…… scanf("%d",&m); 4.处理结构的设计: 二进制与八进制转换流程图 十六进制转换流程图 5.源程序: #include int main() { unsigned long a,temp;//定义无符号长整型 char b[64]; char o[21]; char h[16];//无符号长整型数的取值范围 int i,m=1; while(m) { printf("Input number:"); scanf("%ld",&a); temp=a; i=0; while(temp&&i<64) { b[i]=temp%2+'0';//求余;强制类型转换为实数 temp/=2;//整除运算 i++; } printf("\n二进制: "); i--;//返回最后一个数的位置 while(i>=0) { printf("%c",b[i]); i--;//从后向前依次输出 } printf("\n"); temp=a; i=0; while(tem

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧