这是我今天刷题的时候刷到的一道题,要求就是把十六进制的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的数,实际小数点后不止这么几位。