C语言:从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。

注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。

int main()
{

//进制转换4:从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
int i=0,n=0;
char a[10];
unsigned long sum=0;

scanf("%s",a);
n=strlen(a);
for (i=0;i<n;i++)
{
//注:ascii码:A~65 0~48
//b=a[i];
if (a[i]>='0'&&a[i]<='9')// 输入的数范围在0~9
{
sum=sum*16;
sum=sum+a[i]-'0';
}
if (a[i]>='A'&&a[i]<='F')// 输入的数范围在10~15
{
sum=sum*16;
sum=sum+a[i]-'A'+10;
}
}
printf("%d",sum);
//-----------------------------------------------------------*/

return 0;}
这个程序调了老一阵,每次输入的十六进制数大于等于“80000000”时输出时总是溢出,小于等于“7FFFFFFF”时输出正常,后来把sum的类型从“int”改为了“unsigned long”,还是不行,得不到结果,,,这是为什么?~~感谢感谢

把最后的printf("%d",sum)改成printf("%u",sum)。
所有大于0x80000000的数用%d输出时,都是负数。追问

哦~~如此~~谢谢
还有一个疑问,那这样的话,可以把sum的类型就固定在“int ”型而不改成“unsigned ”型么?为什么?

追答

可以。不管你把他定义成int还是unsigned,二进制表示是不会变的。仅仅在解释成10进制时有所不同。

追问

这样..可是如果仅仅把sum定义为整型的话,它在变化过程中所存储的数据的范围不会超过所能存储的整型数据的范围么?这样为什么不会有问题啊?

追答

所谓溢出,是对十进制来说的。对二进制来说,只有简单的、统一的二进制加法。
0x7F FF FF FF,不论是int还是unsigned,+1都会变成0x80 00 00 00。对int来说,这是负数,对unsigned来说,却是正数。但是万变不离其宗,这个数的二进制值总是0x80 00 00 00。
只要你适应int溢出的规律,那么不管是-2147483648的int值,还是2147483648的unsigned值,你的眼前只有0x80 00 00 00这一个值。

温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答