描述

写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。

数据范围:保证结果在 1 \le n \le 2^{31}-1 \1≤n≤231−1 

输入描述:

输入一个十六进制的数值字符串。

输出描述:

输出该数值的十进制字符串。不同组的测试用例用\n隔开。

示例1

输入:
0xAA
复制
输出:
170

我的题解:
int main(void)
{
    //0xFFFFFFFF
    unsigned int data = 0;
    char buffer[11];
    while ( EOF != scanf("%s", buffer))
    {
        int len = strlen(buffer) - 2;
        char ch = 0;
        for(int i=0;i<len;i++)
        {
            ch = buffer[len+1-i];
            if(ch>='0'&&ch<='9')
                ch = 0 + ch - '0';
            else if (ch>='a'&&ch<='f')
                ch = 10 + ch - 'a';
            else if(ch>='A'&&ch<='F')
                ch = 10 + ch - 'A';
            else
                return 0;
            data += ch << (4*i);
        }
        printf("%ld\n", data); //ld
    }
    return 0;
}


自带库:
printf 要用 %ld 来处理 unsigned int 类型的 无符号数,
#include<stdio.h>
int main()
{
    unsigned int a;
    while(scanf("%x",&a)!=EOF) // %i 有符号十进制数
    {
        printf("%ld\n",a); //这里要ld, %d是有符号的int类型
    }
    return 0;
}


一、%d与%i的区别:

(1)在printf格式中使用,没有区别。

(2)在 scanf 格式串中使用时,区别如下:

a. 在scanf格式中,%d 只与十进制形式的整数相匹配。

b. 而%i 则可以匹配八进制、十进制、十六进制表示的整数。·

c. 例如:如果输入的数字有前缀 0(018、025),%i将会把它当作八进制数来处理,如果有前缀0x (0x54),它将以十六进制来处理。

二、%p和%x的区别:

(1)输出类型相同:都是无符号十六进制。

(2)输出结果不同:

a. %p以十六进制的形式是打印地址,编译器多少位,就打印多少位。比如:32位的打印32位,64位打印64位(不够的左边补0);

b. %x的输出位数不固定,比如:0x01,0x0101,0x01010101等。

c. %02x: 02表示不足两位,前面补0输出;如果超过两位,则实际输出。%.2x效果和%02x相同。%-2x,数据不足两位时,后面补空格输出,不额外补0输出; 如果超过两位,则实际输出