ostream & operator << (ostream &, some_type)
この質問は、C++ で通常の数値型を使用して数値を出力する正しい方法についての議論から生じました。
各ベースでの std::showbase と std::showpos の動作に精通している方法では、基本的に相互に排他的です。つまり、10 進数では基数は表示されず、正の数には「+」が追加されます。一方、16 進数または 8 進数では基数が表示されますが、型の値が符号なし型にキャストされたかのように出力されるため、「+」は表示されません (マイナスも表示されません)。
たとえば、次の単純な (冗長な) プログラムは次のとおりです。
#include <iostream>
int main() {
std::cout << std::dec << std::showpos << std::showbase << int64_t(+5) << std::endl;
std::cout << std::oct << std::showpos << std::showbase << int64_t(+5) << std::endl;
std::cout << std::hex << std::showpos << std::showbase << int64_t(+5) << std::endl;
std::cout << std::dec << std::showpos << std::showbase << int64_t(-5) << std::endl;
std::cout << std::oct << std::showpos << std::showbase << int64_t(-5) << std::endl;
std::cout << std::hex << std::showpos << std::showbase << int64_t(-5) << std::endl;
}
GCC でコンパイルすると、次の出力が得られます。
+5
05
0x5
-5
01777777777777777777773
0xfffffffffffffffb
これは、長年 C++ を使用してきた私が常に期待していたことですが、これは本当に標準によって保証されているのでしょうか、それとも単なる一般的な動作なのでしょうか? たとえば、標準準拠の C++ コンパイラは、代わりにこれらのシーケンスの 1 つを出力できますか?
+5
+05
+0x5
-5
01777777777777777777773
0xfffffffffffffffb
あるいは:
+5
+05
+0x5
-5
-05
-0x5