C语言实现16进制转10进制

这是我今天刷题的时候刷到的一道题,要求就是把十六进制的ABCDEF转换为十进制,按理说应该算入门题,可是我今天看到了截然不同的解法。在此分享给大家

(注:我只是一个刚学的菜鸟,完全是凭自己的想法理解的,有什么不对的还望指正,我说的不一定对,知识掌握的还不全面,大多都是网上获取的)

int main() 
 {
    int a = 0xABCDEF;
    printf("%15d", a);
}

这是我们一般会写的代码,它声明了一个整型变量a并将其初始化为十六进制数0xABCDEF,然后使用printf函数以十进制格式打印这个值,并且指定了至少15个字符的宽度。

在C语言中,0x前缀表示后面的数字是十六进制数。所以0xABCDEF是一个十六进制数,其对应的十进制数是:

A * 16^5 + B * 16^4 + C * 16^3 + D * 16^2 + E * 16^1 + F * 16^0
= 10 * 16^5 + 11 * 16^4 + 12 * 16^3 + 13 * 16^2 + 14 * 16^1 + 15 * 16^0
= 10 * 1048576 + 11 * 65536 + 12 * 4096 + 13 * 256 + 14 * 16 + 15
= 10485760 + 720896 + 49152 + 3328 + 224 + 15
= 11259999

printf可以使用使用格式控制串“%md”输出域宽为m的十进制整数。(这里是规定了输出域宽为15)

 因此,printf函数将打印出11259999,由于指定了至少15个字符的宽度,所以实际打印出来的可能是前面带空格的11259999,以确保总宽度至少为15个字符。

接下来看第二种解法:


#include<stdio.h>  // 包含标准输入输出库,用于printf函数
#include<math.h>   // 包含数学库,用于pow函数计算幂
#include<string.h> // 包含字符串处理库,用于strlen函数获取字符串长度

int main() {
    // 定义并初始化一个字符数组,存储十六进制数的字符表示
    char arr[] = "ABCDEF";
    
    // 定义变量i和j,用于循环和数组索引
    int i = 0, j = 0;
    
    // 定义变量sum,用于存储计算结果
    double sum = 0.0;
    
    // 定义变量ch,用于存储当前处理的字符
    char ch;
    
    // 定义一个整型数组num,用于存储每个字符对应的十六进制数值
    int num[10] = { 0 };
    
    // 使用strlen函数计算字符串arr的长度
    int n = strlen(arr);
    
    // 定义变量m,用于存储最终的整数结果
    int m = 0;
    
    // 使用while循环遍历字符串arr中的每个字符
    while (i < n) {
        // 将当前字符赋值给ch变量
        ch = arr[i];
        
        // 使用switch语句根据字符确定其对应的十六进制数值
        switch (ch) {
        case 'A': num[j] = 10; break; // 'A'对应十进制的10
        case 'B': num[j] = 11; break; // 'B'对应十进制的11
        case 'C': num[j] = 12; break; // 'C'对应十进制的12
        case 'D': num[j] = 13; break; // 'D'对应十进制的13
        case 'E': num[j] = 14; break; // 'E'对应十进制的14
        case 'F': num[j] = 15; break; // 'F'对应十进制的15
        }
        
        // 如果当前字符是十六进制字符(即已经在switch中处理过),则增加索引
        if (num[j] != 0) {
            j++;
        }
        
        // 增加i的值以移动到下一个字符
        i++;
    }
    
    // 使用for循环计算十六进制数的十进制值
    for (i = 0; i < j; i++) {
        // 将每个十六进制数值乘以对应的16的幂次,累加到sum中
        sum += num[i] * pow(16, j - 1 - i);
    }
    
    // 将计算结果转换为整数,并存储在变量m中
    m = (int)sum;
    
    // 使用printf函数打印结果,%15d表示至少打印15个字符宽度的整数
    printf("%15d", m);
    
    // 程序结束,返回0表示成功
    return 0;
}

因为数据在计算机中是以二进制的形式存储的,用这种方法虽然更为复杂,但是对于计算机中的数据存储会有一个更好的理解。

该程序输出结果为11259375而不是11259999,pow函数来计算16的幂,这可能会导致浮点数的精度损失。当累加这些浮点数时,误差可能会累积,导致最终结果偏离预期值。

这个可能理解起来需要花一点时间,我也是刚好在学计组才能理解,对于学了计组和汇编的同学来说可能好一点,比如浮点数在计算机中的存储是不精确的,类似13.5实际存储应该是一个无限接近13.5的数,实际小数点后不止这么几位。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值