当前位置: 首页 > news >正文

【C++教程】使用printf语句实现进制转换

在C语言中,printf 函数可以直接实现部分进制转换功能,通过格式说明符(format specifier)快速输出不同进制的数值。以下是详细使用方法及示例代码:


一、printf 原生支持的进制转换

1. 十进制、八进制、十六进制转换
#include <stdio.h>

int main() {
    int num = 255;
    
    // 十进制输出(默认)
    printf("十进制: %d\n", num);  // 255
    
    // 八进制输出(无前缀)
    printf("八进制: %o\n", num);  // 377
    
    // 十六进制输出(小写字母)
    printf("十六进制: %x\n", num); // ff
    
    // 十六进制输出(大写字母)
    printf("十六进制: %X\n", num); // FF
    
    return 0;
}
2. 显示进制前缀
#include <stdio.h>

int main() {
    int num = 255;
    
    // 显示八进制前缀 0
    printf("带前缀的八进制: %#o\n", num); // 0377
    
    // 显示十六进制前缀 0x/0X
    printf("带前缀的十六进制: %#x\n", num); // 0xff
    printf("带前缀的十六进制: %#X\n", num); // 0XFF
    
    return 0;
}
3. 指定输出宽度和填充
#include <stdio.h>

int main() {
    int num = 15;
    
    // 输出8位宽度,不足部分补前导零
    printf("补零的八进制: %#08o\n", num);  // 0000017
    printf("补零的十六进制: %#08x\n", num); // 0x00000f
    
    return 0;
}

二、printf 不支持的进制转换

1. 二进制输出(需要手动实现)
#include <stdio.h>

void print_binary(unsigned int num) {
    if (num > 1) print_binary(num >> 1);
    putchar((num & 1) ? '1' : '0');
}

int main() {
    int num = 10;
    printf("二进制: ");
    print_binary(num); // 1010
    return 0;
}
2. 任意进制转换(通用方法)
#include <stdio.h>
#include <string.h>

void reverse(char* str) {
    int len = strlen(str);
    for (int i = 0; i < len/2; i++) {
        char temp = str[i];
        str[i] = str[len-1 - i];
        str[len-1 - i] = temp;
    }
}

void dec_to_base(unsigned int num, int base, char* output) {
    if (base < 2 || base > 36) {
        strcpy(output, "Invalid base");
        return;
    }

    const char digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    int index = 0;
    
    do {
        output[index++] = digits[num % base];
        num /= base;
    } while (num > 0);
    
    output[index] = '\0';
    reverse(output);
}

int main() {
    char buffer[32];
    dec_to_base(255, 2, buffer);
    printf("二进制: %s\n", buffer); // 11111111
    return 0;
}

三、输入其他进制的数值(scanf 的用法)

#include <stdio.h>

int main() {
    int num;
    
    // 输入十六进制数(如 FF)
    printf("输入十六进制数: ");
    scanf("%x", &num);
    printf("十进制值: %d\n", num); // 255
    
    // 输入八进制数(如 377)
    printf("输入八进制数: ");
    scanf("%o", &num);
    printf("十进制值: %d\n", num); // 255
    
    return 0;
}

四、注意事项

  1. 类型限制

    • 使用 %o, %x, %X 时,建议用 unsigned 类型,避免符号扩展问题:
      unsigned int num = 255;
      printf("%#x\n", num); // 正确输出 0xff
      
  2. 二进制输出优化

    // 使用宏定义快速输出二进制
    #define PRINT_BINARY(n) \
        for (int i = sizeof(n)*8-1; i >= 0; i--) \
            putchar((n & (1 << i)) ? '1' : '0'); \
        putchar('\n')
    
    int main() {
        PRINT_BINARY(10); // 00000000000000000000000000001010
        return 0;
    }
    
  3. 大数处理

    • 对于超过 unsigned int 范围的数值,需使用字符串处理(类似 Python 的 int(string, base))。

通过 printf 可以直接实现八进制、十六进制的输出,二进制和其他进制需要手动实现。若需更复杂的进制转换(如浮点数转换或超大数处理),需结合字符串操作或数学库函数。

相关文章:

  • 前端面试题(八):简述Vue2的响应式原理
  • mysql自动赋值
  • C语言题目自增在前与在后
  • CentOS服务器能ping通却无法yum install:指定镜像源解决
  • 在思科模拟器show IP route 发现Gateway of last resort is not set没有设置最后的通道
  • One-Hot标签编码方法详解
  • 机器学习概述自用笔记(李宏毅)
  • mysql DQL
  • 「小推桌面官方下载」小推桌面TV版-安卓电视版官方免费下载新版
  • 【KWDB创作者计划】_KWDB部署与使用详细版本
  • 批量将多个文件夹转成压缩包,支持设置压缩密码
  • 【数据库系统概论】第3章 SQL(四)视图(超详细)
  • 5 C 程序全流程解析:编写、预处理、编译、汇编、链接、运行与 GCC 指令详解
  • 【C++ Qt】认识Qt、Qt 项目搭建流程(图文并茂、通俗易懂)
  • 【Spring】IoC详解:方法Bean的存储、Bean重命名、扫描路径@Component(下)
  • 计算机操作系统——存储器管理
  • Android 日志输出模块
  • 现在AI大模型能帮做数据分析吗?
  • ScholarCopilot:“学术副驾驶“
  • 【数据结构】励志大厂版·初阶(复习+刷题):复杂度
  • 阿里千问3系列发布并开源:称成本大幅下降,性能超越DeepSeek-R1
  • 人到中年为何腰围变粗?科学家发现腹部脂肪增加的细胞元凶
  • 江苏银行一季度净赚近98亿增逾8%,不良贷款率微降
  • 李祥翔评《孔子哲学思微》︱理性秩序与美学秩序的碰撞
  • 人社部:将会同更多部门分行业、分领域制定专项培训计划
  • 新城市志|中国消费第一城,迎来“补贴力度最大”购物节