方法1:使用标准库函数 sprintf
#include <stdio.h>
void decimalToHex(int num, char *hexStr) {
sprintf(hexStr, "%X", num); // %X 表示大写十六进制,%x 表示小写
}
int main() {
int decimal = 255;
char hexStr[20]; // 存储十六进制字符串
decimalToHex(decimal, hexStr);
printf("十进制 %d 的十六进制表示为: %s\n", decimal, hexStr);
return 0;
}
说明:

(图片来源网络,侵删)
sprintf将格式化后的十六进制字符串写入hexStr。%X输出大写字母(如FF),%x输出小写字母(如ff)。- 需确保
hexStr有足够空间(sizeof(int)*2 + 1足够)。
方法2:手动转换(不依赖库函数)
#include <stdio.h>
void decimalToHex(int num, char *hexStr) {
const char hexDigits[] = "0123456789ABCDEF";
int i = 0;
if (num == 0) {
hexStr[i++] = '0';
} else {
while (num > 0) {
hexStr[i++] = hexDigits[num % 16];
num /= 16;
}
}
hexStr[i] = '\0'; // 字符串结束符
// 反转字符串(因为是从低位到高位计算的)
for (int j = 0; j < i / 2; j++) {
char temp = hexStr[j];
hexStr[j] = hexStr[i - j - 1];
hexStr[i - j - 1] = temp;
}
}
int main() {
int decimal = 255;
char hexStr[20];
decimalToHex(decimal, hexStr);
printf("十进制 %d 的十六进制表示为: %s\n", decimal, hexStr);
return 0;
}
说明:
- 通过模16运算获取每一位的十六进制字符。
- 由于计算顺序是低位到高位,最后需要反转字符串。
- 处理了
num=0的特殊情况。
方法3:递归实现(简洁但效率较低)
#include <stdio.h>
void decimalToHexRecursive(int num, char *hexStr, int *index) {
if (num > 15) {
decimalToHexRecursive(num / 16, hexStr, index);
}
const char hexDigits[] = "0123456789ABCDEF";
hexStr[(*index)++] = hexDigits[num % 16];
}
void decimalToHex(int num, char *hexStr) {
int index = 0;
if (num == 0) {
hexStr[index++] = '0';
} else {
decimalToHexRecursive(num, hexStr, &index);
}
hexStr[index] = '\0';
}
int main() {
int decimal = 255;
char hexStr[20];
decimalToHex(decimal, hexStr);
printf("十进制 %d 的十六进制表示为: %s\n", decimal, hexStr);
return 0;
}
说明:
- 递归调用自然实现高位到低位的顺序,无需反转字符串。
- 通过指针参数
index记录当前写入位置。
注意事项
-
负数处理:
C语言中负数以补码形式存储,直接转换会得到无意义的十六进制,若需处理负数,需先转换为无符号数:unsigned int unsignedNum = (unsigned int)num;
-
前缀 "0x":
若需要在十六进制字符串前加0x,可在sprintf中使用"0X%X",或在手动转换时手动添加。
(图片来源网络,侵删) -
大数处理:
对于long long类型,使用%llX或调整循环逻辑。
示例输出
对于输入 255,所有方法均输出:
十进制 255 的十六进制表示为: FF
(图片来源网络,侵删)
