cout << 输出格式突然变成了16进制

文章讲述了在编程过程中遇到的一个问题,即使用cout打印函数参数值时,从10进制无故转变为不带0x的16进制输出。作者分析了cout的工作原理,指出这是因为修改了cout的输出格式,特别是使用了std::hex但未使用std::showbase。为避免混淆,建议在输出16进制时同时使用std::showbase以显示前缀0x。
摘要由CSDN通过智能技术生成

1. 背景:

在工程中,我通过cout打印一个被频繁调用的函数里面某个参数的值,在前面若干次调用中,cout << 工作正常,是打印的10进制,突然,不清楚什么原因,就开始打印16进制的值,而且是不加0x的16进制,导致我一直以为是10进制,但是加条件断点加不上去,通过if条件也进不去对应的分支,直到我使用printf打印参数的值,才发现打印的值是16进制显示的。。

2. cout << 原理

cout是一个对象(object),类型是ostream,ostream重载了运算符 <<。

3. cout << 如何输出x的16进制

方法1: cout << std::hex << std::showbase << x;
方法2: cout.flags(std::ios::hex | std::ios::showbase);

并且,上面的设置是全局设置,只要你在某个地方设置了上面的输出格式,程序成功执行了该语句之后,程序接下来的执行cout时都会按照16进制输出;

为什么是全局设置呢?因为cout是个全局对象,通过方法1和方法2其实是修改了cout内部的属性。

依据上面的理解,我检查了下我的代码,发现确实是在某个时候,程序在进行cout输出的通过方法1设置了输出格式,并且只是设置了std::hex,而没有设置std::showbase,所以是不带0x的16进制输出;正式由于不带0x前缀导致我很疑惑,所以强烈建议 在16进制输出的时候,加上std::showbase; 减少疑惑。

1、阅读下列程序,然后上机运行验证输出结果,并回答下列问题。 #include <iostream> using namespace std; void showflags(long f) { long i = 0x8000; for(; i; i=i>>1) { if(i&f) cout<<"1"; else cout<<"0"; } cout<<endl; } int main() { showflags(cout.flags()); cout<<"x_width="<<cout.width()<<endl; cout<<"x_fill="<<cout.fill()<<endl; cout<<"x_precision="<<cout.precision()<<endl; cout<<123<<" "<<123.45678<<endl; cout<<"-----------------------------"<<endl; cout<<"* * * x_width=10,x_fill= ,x_precision=4 * * *"<<endl; cout.width(10); cout.precision(4); cout<<123<<" "<<123.45678<<" "<<234.567<<endl; -------------------① cout<<"x_width="<<cout.width()<<endl; cout<<"x_fill="<<cout.fill()<<endl; cout<<"x_precision="<<cout.precision()<<endl; cout<<"-----------------------------"<<endl; cout<<"* * * x_width=10,x_file=&,x_precision=4 * * *"<<endl; cout.fill('&'); cout.width(10); cout<<123<<" "<<123.45678<<endl; cout.setf(ios::left); cout.width(10); cout<<123<<" "<<123.45678<<endl; cout<<"x_width="<<cout.width()<<endl; cout<<"x_fill="<<cout.fill()<<endl; cout<<"x_precision="<<cout.precision()<<endl; showflags(cout.flags());----------------------------------------------------------② cout.setf(ios::right|ios::unitbuf); showflags(cout.flags());----------------------------------------------------------③ return 0; } 问题一:①处的输出结果是什么,为什么? 问题二:②处的输出结果是什么,为什么? 问题三:③处的输出结果是什么,为什么? (提示:在x_flags变量中left=0x0002,right=0x0004,unitbuf=0x2000)
06-11
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值