2016-03-10 7 views
2

Я должен напечатать на стандартном выходе некоторые значения std::uint16_t как шестнадцатеричные со следующим форматированием текста: 0x##. Я нашел этот код в Интернете, который работает отлично подходит для каждого значения, кроме 0:std :: cout of hexadecimal 0x00

std::cout << std::internal 
      << std::setfill('0') 
      << std::hex 
      << std::showbase 
      << std::setw(4) 
      << value << std::endl; 

По какой-то причине я не понимаю, 0 печатается как 0000. Все остальные значения правильно напечатаны, как ожидалось.

+5

Как видно в [разделе Notes здесь] (http://en.cppreference.com/w/cpp/io/manip/showbase #Notes), это был преднамеренный выбор. Как обойти это? Не уверен, боюсь, никогда не понадобилось. Похоже, вам может понадобиться создать свой собственный ['num_put'] (http://en.cppreference.com/w/cpp/locale/num_put), который является болью в пресловутых. – BoBTFish

+0

_One вопрос за вопрос please._ –

+3

Я уверен, что программист разработал эту систему («Нуль одинаково на каждой базе, в чем проблема?»). Я думаю, что '... <<" 0x "<< setw (2) << ...' должен работать. – molbdnilo

ответ

1

За дополнительным вопросом. Вам нужно только установить ширину снова. Остальные манипуляторы настойчивы.

std::cout << std::internal 
     << std::setfill('0') 
     << std::hex 
     << std::showbase ; 

for(std::uint16_t i =1;i<255;++i){ 
     std::cout<< std::setw(4)<<i<<"\n"; 
} 

Чтобы преодолеть setw вопрос здесь некоторые обходные пути: “Permanent” std::setw

Смежные вопросы