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
Я нашел это на 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. Прости.
Тот факт, что std :: showbase не имеет «0x», когда значение равно нулю, иногда раздражает, но это то, как он определяется, и вы ничего не можете с этим поделать , кроме:
std::cout << "0x" << .....
Разрыв между "0x" и остальными поправим, но угадать его не очень легко. Попробуйте
std::cout << std::hex << std::showbase << std::setw(8) << std::setfill('0') << h;