Użyj <iomanip>
's std::hex
. Jeśli drukujesz, po prostu wyślij go na std::cout
adres, jeśli nie, użyjstd::stringstream
std::stringstream stream;
stream << std::hex << your_int;
std::string result( stream.str() );
Można poprzedzić pierwsze <<
z << "0x"
lub cokolwiek chcesz, jeśli chcesz.
Inne interesujące manipulacje to std::oct
(ósemkowe) i std::dec
(z powrotem do dziesiętnych).
Jednym z problemów, które możesz napotkać, jest fakt, że daje to dokładną liczbę cyfr potrzebną do jego przedstawienia. Możesz użyć setfill
i setw
to, aby obejść problem:
stream << std::setfill ('0') << std::setw(sizeof(your_type)*2)
<< std::hex << your_int;
Na koniec zasugerowałbym taką funkcję:
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();
}
Kornel Kisielewicz
źródło
int
typu;)std::setw
musi być wyjście do strumienia dla każdego int, natomiaststd::hex
,std::setfill
,std::uppercase
, ... wystarczy być wysyłane do strumienia wyjściowego raz. Wydaje się to niespójne?Aby było lżejsze i szybsze sugeruję użycie bezpośredniego wypełnienia sznurka.
źródło
double
ifloat
(i nie dla wskaźników)0000FFFF
dla0xFFFF
. Wolę mieć0xFFFF
jako wyjście.Służy
std::stringstream
do konwersji liczb całkowitych na łańcuchy i specjalnych manipulatorów do ustawiania podstawy. Na przykład tak:źródło
Po prostu wydrukuj to jako liczbę szesnastkową:
źródło
std::cout<<std::hex<<i<<std::dec;
, w przeciwnym razie wszystkie liczby całkowite, które są przesyłane później, będą w formacie szesnastkowym. Nie musisz tego robić w przypadku innych odpowiedzi, które używają,stringstream
ponieważ strumień jest odrzucany po użyciu, alecout
żyje wiecznie.Możesz spróbować następujących rzeczy. To działa...
źródło
to_string
jest to część przestrzeni nazwstd
w C ++ 11To pytanie jest stare, ale dziwię się, dlaczego nikt nie wspomniał
boost::format
:źródło
źródło
Dzięki poniższemu komentarzowi Lincolna zmieniłem tę odpowiedź.
Poniższa odpowiedź poprawnie obsługuje 8-bitowe liczby int w czasie kompilacji. Jednak wymaga C ++ 17. Jeśli nie masz C ++ 17, będziesz musiał zrobić coś innego (np. Podać przeciążenia tej funkcji, jedną dla uint8_t i jedną dla int8_t, lub użyć czegoś innego niż „if constexpr”, może enable_if).
Oryginalna odpowiedź, która nie obsługuje poprawnie 8-bitowych intów, tak jak myślałem:
Odpowiedź Kornela Kisielewicza jest świetna. Jednak niewielki dodatek pomaga wychwycić przypadki, w których wywołujesz tę funkcję z argumentami szablonu, które nie mają sensu (np. Float) lub które spowodowałyby nieporządne błędy kompilatora (np. Typ zdefiniowany przez użytkownika).
Zmodyfikowałem to, aby dodać wywołanie do std :: to_string, ponieważ 8-bitowe typy całkowite (np.
std::uint8_t
Przekazane wartości)std::stringstream
są traktowane jako znaki, co nie daje pożądanego wyniku. Przekazywanie takich liczb całkowitych w celustd::to_string
ich poprawnej obsługi i nie szkodzi przy korzystaniu z innych, większych typów liczb całkowitych. Oczywiście w takich przypadkach może wystąpić niewielki spadek wydajności, ponieważ wywołanie std :: to_string jest niepotrzebne.Uwaga: dodałbym to w komentarzu do oryginalnej odpowiedzi, ale nie mam przedstawiciela, który mógłby to skomentować.
źródło
char
(co różni się od obuuint8_t
iint8_t
większości implementacji (gdzie są odpowiedniounsigned char
isigned char
)).... && !std::is_same_v<char, T> && !std::is_same_v<bool, T>
etc ...Dla tych z Was, którzy zorientowali się, że wiele / większość z
ios::fmtflags
nich nie działastd::stringstream
jeszcze z pomysłem szablonu, który Kornel opublikował dawno temu, poniższe działa i jest stosunkowo czyste:źródło
Ja robię:
Spójrz na odpowiedź SO z iFreilicht i wymagany plik nagłówkowy szablonu stąd GIST !
źródło
Wystarczy spojrzeć na moje rozwiązanie [1], które dosłownie skopiowałem z mojego projektu, więc dołączony jest niemiecki dokument API. Moim celem było połączenie elastyczności i bezpieczeństwa z moimi rzeczywistymi potrzebami: [2]
0x
dodano prefiksu : dzwoniący może zdecydowaćlong long
[1] na podstawie odpowiedzi Kornela Kisielewicza
[2] Przetłumaczone na język CppTest , tak brzmi:
źródło
TEST_ASSERT(int_to_hex(short(0x12)) == "0012");
Kod w celach informacyjnych:
źródło
clear
tegosstream
(zostanie zniszczone, gdy funkcja i tak powróci w następnym wierszu). Można uniknąć nazwanyhexStr
całkowicie i po prostureturn sstream.str();
bezclear
ing i uzyskać ten sam efekt, co zmniejsza cztery linie kodu do jednego.sstream.clear();
?sstream
Obiekt jest automatycznie zniszczony pod koniec zakresu, takreturn sstream.str();
by to zrobić.sstream.clear
po prostu wyczyści zawartość, zanim strumień zakończy się na końcu zasięgu (aby usunąć wszystkie flagi niepowodzenia i eof z clear). Rzeczywiście, gdy zakres umiera, wraz z okresem życia zmiennej strumieniowej, i dlategosstream.str
może być używany do zwracania wartości. [Odniesienie: cplusplus.com/reference/ios/ios/clear/]Moje rozwiązanie. Dozwolone są tylko typy całkowite.
Aktualizacja. W drugim parametrze można ustawić opcjonalny prefiks 0x.
definicja. h
main.cpp
Wyniki:
0xfe
0xfe
0xFFFFFFFE
0xfffffffffffffffe
fe
fe fffffffe
fffffffffffffffe
źródło
Chciałbym dodać odpowiedź, aby cieszyć się pięknem języka C ++. Jego zdolność przystosowania do pracy na wysokich i niskich poziomach. Miłego programowania.
Przykłady:
źródło
Korzystanie z void pointer:
Dodawanie 0x:
Wyjścia:
źródło
0x69fec4 (adres)
6946500 (adres do dec)
0x69fec4 (adres do dec, wyjście szesnastkowe)
instynktownie poszedł z tym ...
int address = (int) & var;
widziałem to gdzie indziej ...
unsigned long address = reinterpret_cast (& var);
komentarz powiedział mi, że to jest poprawne ...
int address = (int) & var;
mówiąc o dobrze zakrytej lekkości, gdzie jesteś? dostaje za dużo polubień!
źródło
unsigned long
alestd::intptr_t
.intptr_t
Może przechowywać dowolny wskaźnik na platformie budowlanej; nie jest to [koniecznie] prawdąunsigned int
. I znowu nic z tego nie ma znaczenia dla pytania. Żadnych dalszych odpowiedzi ode mnie