文章

【GESP】C++三级知识点研究,cout输出进制转换

GESP C++三级考试大纲中,涉及进制转换的内容,之前在考纲介绍中重点针对进制转换的数学方法进行了介绍,在进行真题练习的过程中,发现其中涉及不少cout函数进制输出的题目,因此本文对此进行总结分享。

相关考纲:


在 C++ 编程中,我们经常需要以不同进制(如 二进制、八进制、十六进制)的形式输出整数。cout 提供了直观的格式控制方式,但每种进制的处理方式略有不同。

一、基础知识:cout 与格式控制符

C++ 中的 cout(定义于 <iostream>)可以通过 操纵符(manipulators) 来控制整数的进制输出。这些操纵符定义于头文件 <iomanip> 中。

二、常见格式控制符

控制符功能恢复方法
hex, oct, dec设置进制(十六,八,十进制)设置为 dec 恢复
bitset<N>(x)用于显示 x 的 N 位二进制表示设置为 dec 恢复
showbase显示 0x0 前缀noshowbase
uppercase十六进制字母大写nouppercase
left, right, internal对齐方向设置为 right 等默认
setfill()设置填充字符setfill(' ')

可以看到,格式控制符的设置不是一次性的,在设置后会持续作用于后续所有输出,直到你显式修改或恢复为默认,这点需要注意。当然也有一些一次性有效的格式控制符,如:

控制符功能特点
setw(n)设置字段宽度只作用于下一个输出项

🔸 综合示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <iomanip>   // oct, hex, dec, showbase, uppercase
#include <bitset>    // bitset 用于二进制输出

using namespace std;

int main() {
    int value = 255;

    // 十进制(默认)
    cout << "十进制: " << value << endl;

    // 八进制输出
    cout << oct;
    cout << "八进制(无前缀): " << value << endl;
    cout << showbase << "八进制(带前缀): " << value << endl;

    // 十六进制输出
    cout << hex;
    cout << "十六进制(小写): " << value << endl;
    cout << uppercase << "十六进制(大写): " << value << endl;
    cout << showbase << "十六进制(大写带前缀): " << value << endl;

    // 恢复十进制
    cout << dec << nouppercase << noshowbase;
    cout << "恢复十进制: " << value << endl;

    // 二进制输出
    cout << "二进制(8位): " << bitset<8>(value) << endl;
    cout << "二进制(16位): " << bitset<16>(value) << endl;

    return 0;
}

输出解释(value = 255):

1
2
3
4
5
6
7
8
9
十进制: 255
八进制(无前缀): 377
八进制(带前缀): 0377
十六进制(小写): ff
十六进制(大写): FF
十六进制(大写带前缀): 0XFF
恢复十进制: 255
二进制(8位): 11111111
二进制(16位): 0000000011111111

🔸 同时按不同控制符输出

你可以一行中依次设置不同控制符:

1
2
3
cout << "十六进制: " << hex << showbase << value << ", ";
cout << "八进制: " << oct << showbase << value << ", ";
cout << "十进制: " << dec << value << endl;

🔸 二进制格式控制(补零等)

1
2
3
int n = 5;
cout << "补零二进制(8位): " << bitset<8>(n) << endl;
// 输出:00000101

🔸 控制符影响与恢复

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <iomanip>
using namespace std;

int main() {
    int x = 255;

    cout << hex << showbase << uppercase;
    cout << "十六进制格式输出: " << x << endl;  // 输出: 0XFF

    // 下一行也会被格式影响(仍是 hex、showbase、uppercase)
    cout << "再次输出十六进制: " << x << endl;  // 输出: 0XFF

    // ✅ 显式恢复为默认设置
    cout << dec << noshowbase << nouppercase;
    cout << "恢复十进制输出: " << x << endl;   // 输出: 255

    // setw 只对下一个输出有效
    cout << setfill('0') << setw(5) << x << " ";
    cout << x << endl;  // 第二个 x 没有被 setw(5) 影响
}

三、与printf格式化输出对比

进制cout 操纵符(C++风格)printf 格式控制(C风格)示例值:x = 255输出示例
十进制cout << dec << x;(默认)printf("%d", x); 255
八进制cout << oct << x;printf("%o", x); 377
八进制(前缀)cout << showbase << oct << x;printf("%#o", x); 0377
十六进制cout << hex << x;printf("%x", x); ff
十六进制(大写)cout << uppercase << hex << x;printf("%X", x); FF
十六进制(前缀)cout << showbase << hex << x;printf("%#x", x); 0xff
十六进制(大写+前缀)cout << showbase << uppercase << hex << x;printf("%#X", x); 0XFF
二进制cout << bitset<N>(x);(需 #include <bitset>❌ 不支持(需自定义实现)bitset<8>(255)11111111
二进制(补零)bitset<16>(x)❌ 不支持bitset<16>(5)0000000000000101

重点对比说明

项目cout(C++)printf(C)
风格类型安全、链式操作、可组合控制字符串灵活、传统写法
默认输出进制十进制(dec十进制(%d
八/十六进制支持原生支持操纵符 oct, hex, showbase原生支持 %o, %x, %#x
大小写控制uppercase%x / %X
二进制输出需使用 bitset<N>(x)不支持,需要自己写函数
输出前缀showbase 控制%#o%#x 控制
灵活性更现代、支持重载、自定义格式简洁快速、格式灵活

示例比较:输出 255

使用 cout

1
2
3
4
5
6
7
int x = 255;
cout << dec << x << endl;                        // 255
cout << oct << x << endl;                        // 377
cout << showbase << oct << x << endl;            // 0377
cout << hex << x << endl;                        // ff
cout << showbase << uppercase << hex << x << endl; // 0XFF
cout << bitset<8>(x) << endl;                    // 11111111

使用 printf

1
2
3
4
5
6
7
int x = 255;
printf("%d\n", x);      // 255
printf("%o\n", x);      // 377
printf("%#o\n", x);     // 0377
printf("%x\n", x);      // ff
printf("%#X\n", x);     // 0XFF
// 二进制需要自写函数,无法直接 printf

总结建议

场景推荐使用
类型安全、现代 C++ 风格cout
需要二进制输出、位操作调试cout + bitset
需要快速格式化、多种格式混合打印printf
在嵌入式/老系统中(如比赛)printf

所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

GESP各级别考纲、真题讲解、知识拓展和练习清单等详见【置顶】【GESP】C++ 认证学习资源汇总

luogu-”系列题目已加入洛谷Java、C++初学团队作业清单,可在线评测,团队名额有限。

bcqm-”系列题目可在编程启蒙题库进行在线评测。

欢迎加入Java、C++、Python技术交流QQ群(982860385),大佬免费带队,有问必答

欢迎加入C++ GESP/CSP认证学习QQ频道,考试资源总结汇总

欢迎加入C++ GESP/CSP学习交流QQ群(688906745),考试认证学员交流,互帮互助

GESP/CSP 认证学习微信公众号
GESP/CSP 认证学习微信公众号
本文由作者按照 CC BY 4.0 进行授权