如何使用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 。

脚注:

  1. 这条线负责显示底座,可以是以下任一种:

     << "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 ,并应用特殊处理。

  2. 根据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;