Этот вопрос возник в результате обсуждения правильного способа вывода числового значения с помощью обычного ostream & operator << (ostream &, some_type)
для числового типа в C ++ .
Насколько я знаю поведение std :: showbase и std :: showpos в каждой базе, они в основном исключают друг друга. То есть: в десятичной системе счисления основание не отображается, а к положительным числам добавляется «+»; тогда как в шестнадцатеричном или восьмеричном формате отображается основание, но знак «+» не отображается (и не является минусом), поскольку значение типа печатается так, как если бы оно было приведено к беззнаковому типу.
Например, эта простая (многословная) программа:
#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 ++, соответствующий стандарту, вместо этого вывести одну из этих последовательностей?
+5
+05
+0x5
-5
01777777777777777777773
0xfffffffffffffffb
или даже:
+5
+05
+0x5
-5
-05
-0x5