ostream showbase не показывает “0x” для нулевого значения

PSPS: (постскриптум предв виде сценария)
Это только что пришло на ум, из которого более пророческий вопрос включал бы понятие: этот недисплей "0x" (showbase) для целых чисел нулевого значения стандартное поведение, или это - просто причуда моей реализации MinGW?

Все это началось в приятное воскресенье утром... Я хочу вывести некоторые Дескрипторы в их шестнадцатеричном представлении, и последовательным, отформатированным способом.
Я хочу продвижение 0x и фиксированная ширина, но это оказывается неуловимым использованием ожидаемых потоковых манипуляторов.
Единственным путем я нашел, чтобы сделать, это должно бросить Дескрипторы к неподписанному долго. Это кажется немного неблагоразумным, и я ожидал бы, что я не единственный человек, чтобы когда-либо хотеть это..
Я пропускаю что-то в стандартных шестнадцатеричных манипуляторах? Это, потому что тип пусто* (ДЕСКРИПТОР) просто определяется за пределами нормальной обработки шестнадцатеричного числа ostream?

Таким образом: Я не хочу должным быть бросать ДЕСКРИПТОР к чему-то, что это не.
и я не хочу трудно кодировать "0x" префикс. Существует ли способ сделать это с помощью стандартных манипуляторов? или я должен был бы перегрузить обработку ostream ДЕСКРИПТОРА? (но это могло бы перегрузить меня!)

Вот мой тестовый код (и его вывод).
Я использовал '.' в качестве символа заливки для ясности, (я буду на самом деле использовать '0'),

HANDLE h; 
ULONG ul; 
int iH = sizeof(h); // how many bytes to this void* type.
int iW = iH*2;      // the max number of hex digits (width).
int iW2= iW+2;      // the max number of hex digits (+ 2 for showbase "0x").
int iX = 4;         // the number of bits per hex digit.
int ib = iH*8;      // the max number bits in HANDLE (exponent).
int i;
std::cout<<std::setfill('.'); // I actually want '0'; 
                              //   the dot is for display clarity
for( i=0; i<=ib; i+=iX )
{ ul = (pow(2,i)-1);
  h  = (HANDLE)ul;
  std::cout
  <<"//  ul "        <<std::setw(iW2)<<std::hex <<std::showbase  <<std::internal <<ul
  <<"     h "        <<std::setw(iW2) /* hex,showbase,internal have no effect */ <<h
  <<"      I want 0x"<<std::setw(iW) <<std::hex <<std::noshowbase<<std::right    <<(ULONG)h
  <<std::endl;
}

//  ul .........0     h .........0      I want 0x.......0
//  ul 0x.......f     h .......0xf      I want 0x.......f
//  ul 0x......ff     h ......0xff      I want 0x......ff
//  ul 0x.....fff     h .....0xfff      I want 0x.....fff
//  ul 0x....ffff     h ....0xffff      I want 0x....ffff
//  ul 0x...fffff     h ...0xfffff      I want 0x...fffff
//  ul 0x..ffffff     h ..0xffffff      I want 0x..ffffff
//  ul 0x.fffffff     h .0xfffffff      I want 0x.fffffff
//  ul 0xffffffff     h 0xffffffff      I want 0xffffffff
10
задан vll 13 September 2018 в 08:46
поделиться

2 ответа

Я нашел это на https://bugzilla.redhat.com/ show_bug.cgi? id = 166735 - это копирование / вставка прямо оттуда.

Мне не кажется, что это ошибка. ISO C ++ 98, 22.2.2.2.2 / 10 говорит, что std :: showbase означает добавление преобразования # printf квалификатор. 22.2.2.2.2 / 7 говорит, что std :: hex означает, что спецификатор преобразования printf %Икс. Таким образом, поведение IMHO должно быть таким же, как printf ("% # x", 0); Но http://www.opengroup.org/onlinepubs/009695399/functions/fprintf.html говорит: "Для спецификаторов преобразования x или X ненулевой результат должен иметь 0x (или 0X) с префиксом к нему ". То же самое и в ISO C99, 7.19.6.1 (6): «Для преобразования x (или X) ненулевой результат имеет префикс 0x (или 0X)».

Так что это звучит как стандарт C ++ 98 (говоря «сделайте это как printf из C» («% # x ", 0) ') требует такого глупого поведения, которое вы наблюдаете. Единственный способ получить то, что вы хотите, - это избавиться от std :: showbase и явно вывести 0x. Прости.

11
ответ дан 3 December 2019 в 21:19
поделиться

Тот факт, что std :: showbase не имеет «0x», когда значение равно нулю, иногда раздражает, но это то, как он определяется, и вы ничего не можете с этим поделать , кроме:

std::cout << "0x" << .....

Разрыв между "0x" и остальными поправим, но угадать его не очень легко. Попробуйте

std::cout << std::hex << std::showbase << std::setw(8) << std::setfill('0') << h;
6
ответ дан 3 December 2019 в 21:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: