Are std :: showbase y std :: showpos mutuamente excluyentes?
sta pregunta surgió de una discusión que estaba teniendo sobre la forma correcta de generar un valor numérico usando la @ habituostream & operator << (ostream &, some_type)
para un tipo numérico en C ++.
La forma en que estoy familiarizado con el comportamiento de std :: showbase y std :: showpos en cada base, son básicamente mutuamente excluyentes. Es decir: en decimal no se muestra ninguna base, y el '+' se agrega en números positivos; mientras que en hexadecimal u octal, se muestra la base, pero no se muestra un '+' (ni un signo menos), ya que el valor del tipo se imprime como si se convirtiera en un tipo sin signo.
Por ejemplo, este programa simple (detallado):
#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;
}
Da este resultado cuando se compila con GCC:
+5
05
0x5
-5
01777777777777777777773
0xfffffffffffffffb
Esto es lo que siempre he esperado, después de haber usado C ++ durante muchos años, pero ¿está realmente garantizado por el estándar o es solo un comportamiento común? Por ejemplo, ¿podría un compilador C ++ compatible con el estándar generar una de estas secuencias en su lugar?
+5
+05
+0x5
-5
01777777777777777777773
0xfffffffffffffffb
o incluso
+5
+05
+0x5
-5
-05
-0x5