当前位置:首页>维修大全>综合>

c语言十六进制与十进制转换(c语言十进制转换为十六进制方法)

c语言十六进制与十进制转换(c语言十进制转换为十六进制方法)

更新时间:2024-03-07 07:54:43

c语言十六进制与十进制转换

C语言中可以使用以下两种方法进行十六进制与十进制之间的转换:

1. 使用标准函数库中的函数进行转换:

- 十六进制转十进制:使用 `strtol()` 函数,该函数将一个字符串转换为长整型数值。例如:

  ````c

  char hex_str[] = "1A";

  long decimal_num = strtol(hex_str, NULL, 16);

  printf("%ld", decimal_num); // 输出结果为:26

  ```

  在这里,`strtol()` 函数的第一个参数为需要转换的十六进制字符串,第二个参数为指向第一个无法转换的字符的指针,第三个参数为进制数,这里设置为 16。

- 十进制转十六进制:使用 `sprintf()` 函数将十进制数转换为十六进制字符串,例如:

  ````c

  int decimal_num = 26;

  char hex_str[10];

  sprintf(hex_str, "%X", decimal_num);

  printf("%s", hex_str); // 输出结果为:1A

  ```

  在这里,`sprintf()` 函数的第一个参数为存储转换结果的字符数组,第二个参数为格式化字符串,这里使用 `%X` 表示将整数以十六进制输出。

2. 使用算法进行转换:

- 十六进制转十进制:将每一位十六进制数转换为十进制,然后将各个位数的十进制数相加即可。例如:

  ````c

  char hex_str[] = "1A";

  int decimal_num = 0;

  for(int i = 0; hex_str[i] != ''; i++) {

      int digit = 0;

      if(hex_str[i] >= '0' && hex_str[i] <= '9') {

          digit = hex_str[i] - '0'; // 将字符 '0' ~ '9' 转换为相应的数字

      } else if(hex_str[i] >= 'A' && hex_str[i] <= 'F') {

          digit = hex_str[i] - 'A' + 10; // 将字符 'A' ~ 'F' 转换为相应的数字

      }

      decimal_num = decimal_num * 16 + digit;

  }

  printf("%d", decimal_num); // 输出结果为:26

  ```

  在这里,通过循环遍历十六进制字符串的每一位,根据字符的 ASCII 码值将其转换为相应的数字,然后将各个位数的数字相加即可得到十进制数值。

- 十进制转十六进制:将十进制数不断除以 16,得到的余数即为对应的十六进制数,直到商为 0。然后将得到的各个十六进制数倒序排列即可。例如:

  ````c

  int decimal_num = 26;

  char hex_str[10];

  int i = 0;

  while(decimal_num > 0) {

      int remainder = decimal_num % 16;

      if(remainder < 10) {

          hex_str[i] = remainder + '0';

      } else {

          hex_str[i] = remainder - 10 + 'A';

      }

      decimal_num /= 16;

      i++;

  }

  hex_str[i] = '';

  strrev(hex_str); // 将十六进制字符串倒序排列

  printf("%s", hex_str); // 输出结果为:1A

  ```

  在这里,通过循环计算得到十进制数不断除以 16 的余数,然后根据余数将其转换为相应的十六进制数,并将得到的十六进制数存储到字符数组中,最后将字符数组倒序排列即可。需要注意的是,由于存储到字符数组中的十六进制数是倒序排列的,因此最后需要使用 `strrev()` 函数将其倒序排列回来。

这里有两种情况:

①第一种情况:如果我得到的是一个16进制数,我通过肉眼看到的就是16进制显示(这里看到的肯定打印结果),比如85,我知道这个数是16进制,但是代码里面却不是,在内存空间里却是按照int类型10进制进行存储的。需要将它在内存空间里面也转化为16进制的存储。

#include <stdio.h>

#include <stdint.h>

int main() {

uint8_t str[6] = {0};

uint8_t num_16 = 0;

uint32_t num = 85;

printf("%7cDEC HEX ", '');

printf("num %3d %3x ", num, num);

int temp = 0;

sprintf((char *)str, "%d", num);

sscanf((char *)str, "%x", &temp);

num_16 = temp;

printf("num_16 %3d %3x ", num_16, num_16);

return 0;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

运行结果:

DEC HEX

num 85 55

num_16 133 85

1

2

3

1

2

3

上述10进制存储的16进制数85就转化成了16进制存储的16进制数85。**此时,经过此转换的数大小已经变了,它们大小是不相等的。**同理可以将16进制转换为10进制数。

②第二种情况:在第一种情况下,我是将肉眼看到的16进制数(为什么这么说呢?本来我是存储的10进制数,在经过系统或者某段代码的转化后,显示给我的是16进制结果,我看到的结果没有变化,但是在内存空间已经发生变化了。)转化为10进制数 。这里经过系统或者某段代码进行转换的过程就是第二种情况:**10进制到16进制的转换,但是并不会改变值,但是打印出来的记过是已经改变了,如果我要使用这个结果就得通过第一种情况进行转化。

这种转化非常的简单:

printf("%x", num);

1

1

格式化打印,会自动将结果转化为16进制。如果想要将结果进行存储,可参考第一种情况,直接将上述的sprintf和sscanf中的格式化参数%d和%x交换即可。

更多栏目