[英]Why this code error when entering a 4*x symbol number or more? Converting a 16 digit number into 10 digit number
-程序将数字(16)的值作为一串字符(0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F)
-根据字符表转码为正确的值
- 将值转换为十进制
但是...如果:
在: A | 出局:10 (+)
在: AA | 输出:170(+)
在:AAA| out: ...忘记答案但是 (+)
!!! 在:AAAA| 输出:错误(-)
为什么?
#include <STDIO.H>
#include <CONIO.H>
void main()
{
char m[100]; // init massive chars [m]
gets(m); // input massive [m] (16 digit number)
int i = -1; // init counter for [m] (-1 for start [i++] in 0 pos)
while (m[i++]); // go to last postion in [m] and count length
i--; // step back for skip '\0'
i--; // step back for start position last char
int s = 0; // init sum number (10 digit number)
int v = 1; // init multiplier
while (i >= 0) // it is first char?
{
if ((m[i] >= 'A') && (m[i] <= 'F')) s += ((int)(m[i]-55) * v); // if char 'A'(65) char = (10) * multiplier
else s += ((int)(m[i]) * v); // else char 1,2,3,4,5... (1,2,)* multiplier
v *= 16; // up multiplier power
i--; // char step back
}
printf("%i", s); //out sum
}
评论后编辑后:
char m[100];
gets(m);
int i = 0; // * "=-1" -> "0"
while (m[++i]); // * "i++" -> "++i"
i--;
double s = 0; int v = 1;
while (i >= 0)
{
if ((m[i] >= 'A') && (m[i] <= 'F')) s += ((int)(m[i]-55) * v);
if ((m[i] >= '0') && (m[i] <= '9')) s += ((int)(m[i]-48) * v); //add this rules
v *= 16;
i--;
}
printf("%lf", s);
评论后编辑后:
char m[100];
gets(m);
for (int i = 0; m[i] != '\0'; i += 1); // *
unsigned long int s = 0; unsigned long int v = 1; // *
for (int u = 0; u < i; u += 1)
{
if ((m[u] >= 'A') && (m[u] <= 'F')) s += ((int)(m[u]-55) * v);
if ((m[u] >= '0') && (m[u] <= '9')) s += ((int)(m[u]-48) * v);
v *= 16;
}
printf("%lu", s); // *
我应该从 0 开始,而不是 -1。
您还没有注意到它,但是您的数学计算对于数字 0 到 9 是错误的。
如果您希望所有输出对于 16 个十六进制字符都是正数,您需要一个无符号 64 位整数(但是这在您的平台/编译器上实现)并且您需要打印 unsigned long(即不是 %i/%d)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.