如何使用cout打印0x0a而不是0xa?
我怎样才能打印0x0a,而不是使用cout 0xa?
#include <iostream> using std::cout; using std::endl; using std::hex; int main() { cout << hex << showbase << 10 << endl; }
这在GCC中适用于我:
#include <iostream> #include <iomanip> using namespace std; int main() { cout << "0x" << setfill('0') << setw(2) << hex << 10 << endl; }
如果您厌倦了iostream的格式化问题,请尝试Boost.Format 。 它允许使用老式的printf风格的格式说明符,但它是types安全的。
#include <iostream> #include <boost/format.hpp> int main() { std::cout << boost::format("0x%02x\n") % 10; }
从iomanip使用setw和setfill
#include <iostream> #include <iomanip> using std::cout; using std::endl; using std::hex; int main() { cout << "0x" << setfill('0') << setw(2) << hex << 10 << endl; }
就个人而言,iostreams的有状态性总是让我恼火。 我认为提升格式是一个更好的select,所以我build议其他答案。
如果你想更简单的输出一个hex数字,你可以写一个这样的函数:
下面介绍更新版本; 有两种方法可以插入0x
基本指标,脚注详细说明它们之间的差异。 原始版本保存在答案的底部,以免给使用它的人造成不便。
请注意,更新版本和原始版本可能需要对字节大小为9位倍数的系统进行一些定制。
namespace detail { constexpr int HEX_DIGIT_BITS = 4; //constexpr int HEX_BASE_CHARS = 2; // Optional. See footnote #2. // Replaced CharCheck with a much simpler trait. template<typename T> struct is_char : std::integral_constant<bool, std::is_same<T, char>::value || std::is_same<T, signed char>::value || std::is_same<T, unsigned char>::value> {}; } template<typename T> std::string hex_out_s(T val) { using namespace detail; std::stringstream sformatter; sformatter << std::hex << std::internal << "0x" // See footnote #1. << std::setfill('0') << std::setw(sizeof(T) * CHAR_BIT / HEX_DIGIT_BITS) // See footnote #2. << (is_char<T>::value ? static_cast<int>(val) : val); return sformatter.str(); }
它可以使用如下:
uint32_t hexU32 = 0x0f; int hexI = 0x3c; unsigned short hexUS = 0x12; std::cout << "uint32_t: " << hex_out_s(hexU32) << '\n' << "int: " << hex_out_s(hexI) << '\n' << "unsigned short: " << hex_out_s(hexUS) << std::endl;
看到两个选项(详见下面的脚注)live: here 。
脚注:
-
这条线负责显示底座,可以是以下任一种:
<< "0x" << std::showbase
-
第一个选项将显示不正确的自定义types,试图输出负的hex数字为
-0x##
而不是<complement of 0x##>
,其中的符号显示在基数之后(如0x-##
)而不是之前。 这很less是一个问题,所以我个人更喜欢这个选项。如果这是一个问题,那么在使用这些types时,可以在输出基础之前检查否定性,然后使用
abs()
(或返回无符号值的自定义abs()
,如果需要能够处理最- 在2的补码系统上的负值)在val
。 -
当
val == 0
,第二个选项将省略基数,显示(例如,对于int
,其中int
是32位)0000000000
而不是期望的0x00000000
。 这是由于showbase
标志在内部像printf()
的#
修饰符一样处理。如果这是一个问题,你可以检查是否
val == 0
,并应用特殊处理。
-
-
根据select显示底座的选项,需要更改两行。
- 如果使用
<< "0x"
,那么HEX_BASE_CHARS
是不必要的,可以省略。 -
如果使用
<< std::showbase
,那么提供给setw()
的值需要考虑这个:<< std::setw((sizeof(T) * CHAR_BIT / HEX_DIGIT_BITS) + HEX_BASE_CHARS)
- 如果使用
原始版本如下:
// Helper structs and constants for hex_out_s(). namespace hex_out_helper { constexpr int HEX_DIGIT_BITS = 4; // One hex digit = 4 bits. constexpr int HEX_BASE_CHARS = 2; // For the "0x". template<typename T> struct CharCheck { using type = T; }; template<> struct CharCheck<signed char> { using type = char; }; template<> struct CharCheck<unsigned char> { using type = char; }; template<typename T> using CharChecker = typename CharCheck<T>::type; } // namespace hex_out_helper template<typename T> std::string hex_out_s(T val) { using namespace hex_out_helper; std::stringstream sformatter; sformatter << std::hex << std::internal << std::showbase << std::setfill('0') << std::setw((sizeof(T) * CHAR_BIT / HEX_DIGIT_BITS) + HEX_BASE_CHARS) << (std::is_same<CharChecker<T>, char>{} ? static_cast<int>(val) : val); return sformatter.str(); }
然后可以这样使用:
uint32_t hexU32 = 0x0f; int hexI = 0x3c; unsigned short hexUS = 0x12; std::cout << hex_out_s(hexU32) << std::endl; std::cout << hex_out_s(hexI) << std::endl; std::cout << "And let's not forget " << hex_out_s(hexUS) << std::endl;
工作示例: 这里 。
试试这个..你简单地在量级上加上零。
cout << hex << "0x" << ((c<16)?"0":"") << (static_cast<unsigned int>(c) & 0xFF) << "h" << endl;
你可以很容易地修改这个来处理更大的数字。
cout << hex << "0x"; cout << ((c<16)?"0":"") << ((c<256)?"0":""); cout << (static_cast<unsigned int>(c) & 0xFFF) << "h" << endl;
因子是16(一个hex数字):
16,256,4096,65536,1048576,..
各自
0x10,0x100,0x1000,0x10000,0x100000,..
所以你也可以这样写
cout << hex << "0x" << ((c<0x10)?"0":"") << ((c<0x100)?"0":"") << ((c<0x1000)?"0":"") << (static_cast<unsigned int>(c) & 0xFFFF) << "h" << endl;
等等..:P
答案缺失的重要之处在于,您必须right
使用所有上述提到的标志:
cout<<"0x"<<hex<<setfill('0')<<setw(2)<<right<<10;
为了缩短输出hex,我做了一个简单的macros
#define PADHEX(width, val) setfill('0') << setw(width) << std::hex << (unsigned)val
然后
cout << "0x" << PADHEX(2, num) << endl;