Используйте <iomanip>
s std::hex
. Если вы печатаете, просто отправьте его std::cout
, если нет, то используйтеstd::stringstream
std::stringstream stream;
stream << std::hex << your_int;
std::string result( stream.str() );
Вы можете предварять первый <<
с << "0x"
или что угодно , если вы хотите.
Другие интересующие нас манипуляции - это std::oct
(восьмеричное) и std::dec
(обратно десятичное).
Одна из проблем, с которой вы можете столкнуться, заключается в том, что это дает точное количество цифр, необходимое для его представления. Вы можете использовать setfill
и setw
это, чтобы обойти проблему:
stream << std::setfill ('0') << std::setw(sizeof(your_type)*2)
<< std::hex << your_int;
Наконец, я бы предложил такую функцию:
template< typename T >
std::string int_to_hex( T i )
{
std::stringstream stream;
stream << "0x"
<< std::setfill ('0') << std::setw(sizeof(T)*2)
<< std::hex << i;
return stream.str();
}
Корнель Киселевич
источник
int
типу;)std::setw
должно быть выход для потока для каждых межд, в то время какstd::hex
,std::setfill
,std::uppercase
, ... нужно только быть отправлены в выходном поток раза. Это кажется непоследовательным?Чтобы было легче и быстрее, предлагаю использовать прямое заполнение строки.
источник
double
иfloat
(и не для указателей)0000FFFF
для0xFFFF
. Я предпочитаю иметь0xFFFF
как результат.Используется
std::stringstream
для преобразования целых чисел в строки и специальных манипуляторов для установки базы. Например так:источник
Просто распечатайте его как шестнадцатеричное число:
источник
std::cout<<std::hex<<i<<std::dec;
, иначе все целые числа, которые передаются позже, будут в шестнадцатеричном формате. Вам не нужно делать это для других ответов, которые используются,stringstream
потому что поток отбрасывается после использования, ноcout
живет вечно.Вы можете попробовать следующее. Это работает...
источник
to_string
это часть пространства именstd
в C ++ 11Это старый вопрос, но я удивлен, почему никто не упомянул
boost::format
:источник
источник
Благодаря приведенному ниже комментарию Линкольна я изменил этот ответ.
Следующий ответ правильно обрабатывает 8-битные int во время компиляции. Однако для этого требуется C ++ 17. Если у вас нет C ++ 17, вам придется сделать что-то еще (например, предоставить перегрузки этой функции, одну для uint8_t и одну для int8_t, или использовать что-то помимо «if constexpr», возможно, enable_if).
Исходный ответ, который не обрабатывает 8-битные целые числа правильно, как я думал:
Ответ Корнеля Киселевича великолепен. Но небольшое дополнение помогает поймать случаи, когда вы вызываете эту функцию с аргументами шаблона, которые не имеют смысла (например, с плавающей точкой) или которые могут привести к беспорядочным ошибкам компилятора (например, определяемого пользователем типа).
Я отредактировал это, чтобы добавить вызов std :: to_string, потому что 8-битные целые типы (например,
std::uint8_t
передаваемые значения)std::stringstream
обрабатываются как char, что не дает желаемого результата. Передача таких целых чисел дляstd::to_string
их правильной обработки и не повредит при использовании других, более крупных целочисленных типов. Конечно, в этих случаях возможно небольшое снижение производительности, поскольку вызов std :: to_string не нужен.Примечание: я бы просто добавил это в комментарий к исходному ответу, но у меня нет представителя для комментариев.
источник
char
(что отличается от обоихuint8_t
иint8_t
в большинстве реализаций (где они соответственноunsigned char
иsigned char
)).... && !std::is_same_v<char, T> && !std::is_same_v<bool, T>
etc ...Для тех из вас, кто понял, что многие / большинство из них
ios::fmtflags
еще не работают,std::stringstream
как идея шаблона, которую Kornel опубликовал еще тогда, следующее работает и относительно чистое:источник
Я делаю:
Взгляните на SO- ответ от iFreilicht и требуемый заголовочный файл шаблона отсюда GIST !
источник
Просто взгляните на мое решение [1], которое я дословно скопировал из моего проекта, так что там есть немецкий документ API. Моей целью было объединить гибкость и безопасность в рамках моих реальных потребностей: [2]
0x
префикса добавил: вызывающий абонент может принять решениеlong long
[1] на основе ответа Корнеля Киселевича
[2] В переводе на язык CppTest он выглядит следующим образом:
источник
TEST_ASSERT(int_to_hex(short(0x12)) == "0012");
Код для справки:
источник
clear
sstream
hexStr
return sstream.str();
clear
sstream.clear();
?sstream
Объект автоматически уничтожается в конце области, так чтоreturn sstream.str();
это сделает.sstream.clear
просто очистит содержимое до того, как поток закончится концом области (чтобы очистить все флаги fail и eof с помощью clear). Действительно, когда область видимости умирает, с продолжительностью жизни переменной потока и, следовательно,sstream.str
может использоваться для возврата по значению. [Ссылка: cplusplus.com/reference/ios/ios/clear/]Мое решение. Допускаются только целые типы.
Обновить. Вы можете установить необязательный префикс 0x во втором параметре.
definition.h
main.cpp
Результаты:
0xfe
0xfe
0xfffffffe
0xfffffffffffffffe
fe
fe fffffffe
fffffffffffffffe
источник
Я хотел бы добавить ответ, чтобы насладиться красотой языка C ++. Его приспособляемость к работе на высоких и низких уровнях. Удачного программирования.
Примеры:
источник
Использование указателя void:
Добавление 0x:
Выходы:
источник
0x69fec4 (адрес)
6946500 (адрес для dec)
0x69fec4 (адрес для dec, вывод в шестнадцатеричном формате)
инстинктивно пошел с этим ...
int address = (int) & var;
видел это в другом месте ...
длинный адрес без знака = reinterpret_cast (& var);
комментарий сказал мне, что это правильно ...
int address = (int) & var;
Говоря о хорошо скрытой легкости, где ты? они получают слишком много лайков!
источник
unsigned long
но»std::intptr_t
.intptr_t
Может хранить любой указатель на платформе сборки; это не [обязательно] верноunsigned int
. И, опять же, все это не имеет отношения к вопросу. Никаких дальнейших ответов от меня