为什么输入4 * x或更多符号号时此代码错误?将16位数字转换为10位数字

时间:2019-12-06 18:53:59

标签: c terminal console numbers

-程序将数字(16)的值作为一个字符串char(0,1,2,3,4,5,6,7,8,9,A,B,C,D,E ,F)

-根据字符表将代码转换为正确的值

将值转换为十进制


但是...如果:

在:A |出:10(+)

在:AA |出:170(+)

在:AAA |出来:...忘记答案,但是(+)

!!!在: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);

+具有输出结果的图像 12

在评论后进行编辑:

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);                      // *

1 个答案:

答案 0 :(得分:0)

我应该从0开始,而不是-1。

您还没有注意到它,但是您的数学错误是数字0到9。

如果您希望所有输出都为16个十六进制字符为正,则需要一个无符号的64位整数(但是,这是在您的平台/编译器上实现的),并且需要打印长的无符号(即,不是%i /%d)。