为什么 cout<<hex satement 使其余部分仅以十六进制格式打印
Why cout<<hex satement makes the rest print in hex format only
我有以下代码段来打印整数的十六进制值
int i=10;
cout<<hex<<i<<endl;
在控制台井上打印10 a
的十六进制值
但在下一行,我需要打印另一个变量的十进制值,比如
int j=11;
cout<<j<<endl;
但它也打印十六进制值11,b
,如果我使用cout<<dec<<j<<endl;
,它打印十进制值。
我还注意到,如果以前使用cout<<hex
,那么所有的cout
都会打印变量的十六进制值。
所以我的问题是这是正常行为吗?如果我以前使用过<<hex
一次,我需要使用<<dec
吗?
是的,必须使用dec
才能获得cout
的十进制值,因为hex
是一个"粘性"操纵器(顺便说一句,和许多其他操纵器一样)-它将一直保持到更改。
您可以编写自己的操纵器来克服"粘性"行为:
#include <iostream>
#include <iomanip>
#include <limits>
// Hex
// ============================================================================
template <typename T>
struct Hex
{
enum { Width = (std::numeric_limits<T>::digits + 1) / 4 };
const T& value;
const int width;
Hex(const T& value, int width = Width)
: value(value), width(width)
{}
void write(std::ostream& stream) const {
if(std::numeric_limits<T>::radix != 2) stream << value;
else {
std::ios_base::fmtflags flags = stream.setf(
std::ios_base::hex, std::ios_base::basefield);
char fill = stream.fill('0');
stream << "0x" << std::setw(width) << value;
stream.fill(fill);
stream.setf(flags, std::ios_base::basefield);
}
}
};
template <typename T>
inline Hex<T> hex(const T& value, int width = Hex<T>::Width) {
return Hex<T>(value, width);
}
template <typename T>
inline std::ostream& operator << (std::ostream& stream, const Hex<T>& value) {
value.write(stream);
return stream;
}
int main()
{
unsigned short i = 0xa;
std::cout << hex(i) << " == " << i << 'n';
return 0;
}
cout是全局的。在操纵器中移动会修改全局的状态。如果你可以将操纵器链接在一起,cout的实例将永远不知道何时"取消设置"它。因此,它会持续存在。
相关文章:
- 如何在openssl-ecc中获取十六进制格式的私钥
- 如何将包含epoch时间的十六进制字符串转换为time_t
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 通过错误处理,在C++中可靠地获得用户十六进制输入
- 为什么mpfr_printf与十六进制浮点(%a转换说明符)的printf不同
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 指向存储在字符串 c++ 中的十六进制
- 读取文件中所有可能的十六进制 16 字节序列并打印每个序列
- C ++如何使用UTF8十六进制代码打印UTF8符号?
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- 如何在C++中将十六进制字符串转换为文本数据
- 使用 sprintf 将十六进制0xAABBCC转换为字符串"AA:BB:CC"
- 绝对编码器十六进制输入
- 为什么C++总是显示十六进制内存地址,而不仅仅是整数?
- C++17 十六进制浮点文字单精度后缀冲突?
- 是否可以在C++中获取 CHAR 的有效十六进制地址?
- 打印十六进制字符
- 以x的倍数填充前导零,使用std::cout<<std::十六进制