C ++ nilai hex cout?

144

Aku ingin melakukan:

int a = 255; 
cout << a;

dan minta FF ditampilkan di keluaran, bagaimana saya melakukan ini?

Cur
sumber

Jawaban:

201

Menggunakan:

#include <iostream>

...

std::cout << std::hex << a;

Ada banyak opsi lain untuk mengontrol pemformatan yang tepat dari nomor keluaran , seperti angka nol di depan dan huruf besar / kecil.

Greg Hewgill
sumber
34
Ini tampaknya mengubah semua output masa depan dari cout ke hex; jadi jika Anda hanya ingin 'a' dicetak dalam hex, Anda mungkin ingin sesuatu cout << hex << a << dec;untuk mengubahnya kembali.
ShreevatsaR
16
@ShreevatsaR Satu masalah dengan mengembalikan dec over hex adalah bahwa dec mungkin bukan nilai yang telah ditetapkan sebelumnya, terutama jika Anda sedang menulis metode perpustakaan umum. Pertanyaan ini memiliki beberapa jawaban tentang cara menyimpan dan memulihkan status. Anda dapat menyimpan status dengan ios::fmtflags f(cout.flags());dan mengembalikannya out.flags(f);.
jtpereyda
Kemudian kembalikan olehstd::cout.flags(f);
truthadjustr
43

std::hexdidefinisikan di <ios>mana termasuk oleh <iostream>. Tetapi untuk menggunakan hal-hal seperti std::setprecision/std::setw/std::setfill/ etc Anda harus memasukkan <iomanip>.

Benoît
sumber
42

Untuk memanipulasi aliran untuk mencetak dalam heksadesimal, gunakan hexmanipulator:

cout << hex << a;

Secara default karakter heksadesimal adalah output dalam huruf kecil. Untuk mengubahnya menjadi huruf besar, gunakan uppercasemanipulator:

cout << hex << uppercase << a;

Untuk mengubah output kembali menjadi huruf kecil, gunakan nouppercasemanipulator:

cout << nouppercase << b;
Ashwin Nanjappa
sumber
2
Apakah nouppercaseakan mengubah output kembali ke desimal?
Cœur
Hanya untuk menambahkan catatan lain-lain, cuplikan di atas tidak akan membuat input "apel" menjadi "APPLE".
truthadjustr
20

Jika Anda ingin mencetak nomor hex tunggal, dan kembali ke desimal Anda dapat menggunakan ini:

std::cout << std::hex << num << std::dec << std::endl;
Yoav
sumber
13

Saya mengerti ini bukan apa yang diminta OP, tapi saya masih merasa perlu untuk menunjukkan bagaimana melakukannya dengan printf. Saya hampir selalu lebih suka menggunakannya daripada std :: cout (bahkan tanpa latar belakang C sebelumnya).

printf("%.2X", a);

'2' mendefinisikan presisi, 'X' atau 'x' mendefinisikan case.

Daniel Sloof
sumber
4
Sudah ada pertempuran printf vs cout. Tentu saja, cout memiliki properti bagus yang berasal dari ostream dan mendapatkan semua manfaat abstraksi. C tidak memiliki konsep objek stream dan karenanya printf dan fprintf adalah 2 perintah yang berbeda. Sungguh, itu akan menyenangkan di C jika stdout adalah FILE *. Akan membuat segalanya lebih mudah.
rlbond
11
@rlbond stdout adalah FILE * di C.
Étienne
4
Itulah sebabnya printf("hello\n")setara dengan fprintf(stdout, "hello\n"). Lebih berguna, Anda bisa meneruskan stdout(atau stdin, atau stderr) ke fungsi yang mengambil FILE*argumen.
Keith Thompson
11

Ada berbagai jenis bendera & topeng yang dapat Anda gunakan juga. Silakan merujuk http://www.cplusplus.com/reference/iostream/ios_base/setf/ untuk informasi lebih lanjut.

#include <iostream>
using namespace std;

int main()
{
    int num = 255;
    cout.setf(ios::hex, ios::basefield);
    cout << "Hex: " << num << endl;

    cout.unsetf(ios::hex);
    cout << "Original format: " << num << endl;

    return 0;
}
Gaurav
sumber
5
Saya pikir perilaku kode ini tidak terdefinisi. Setf menghapus bit ios :: basefield, termasuk ios :: dec (default untuk stream standar), dan hanya menetapkan ios :: hex. Ketika ios :: hex tidak disetel, setiap bit di ios :: basefield tidak disetel. Bagaimana num dicetak untuk kedua kalinya? bukti bahwa bit semuanya tidak disetel: ideone.com/fYXyh6 . Ini diizinkan untuk ios :: floatfield menurut Thinking in C ++ vol 2 halaman 189, tetapi tidak mengatakan hal yang sama tentang ios :: basefield.
Joel Sjögren
10

std::hex memberi Anda format hex, tetapi ini adalah opsi stateful, yang berarti Anda perlu menyimpan dan memulihkan keadaan atau itu akan berdampak pada semua output di masa depan.

Mengalihkan kembali secara naif std::dechanya baik jika di situlah letak bendera sebelumnya, yang mungkin tidak demikian, terutama jika Anda sedang menulis perpustakaan.

#include <iostream>
#include <ios>

...

std::ios_base::fmtflags f( cout.flags() );  // save flags state
std::cout << std::hex << a;
cout.flags( f );  // restore flags state

Ini menggabungkan jawaban dan info Greg Hewgill dari pertanyaan lain .

jtpereyda
sumber
2

Gunakan std::uppercasedan std::hexuntuk memformat variabel integer auntuk ditampilkan dalam format heksadesimal.

#include <iostream>
int main() {
   int a = 255;

   // Formatting Integer
   std::cout << std::uppercase << std::hex << a << std::endl; // Output: FF
   std::cout << std::showbase  << std::hex << a << std::endl; // Output: 0XFF
   std::cout << std::nouppercase << std::showbase  << std::hex << a << std::endl; // Output: 0xff

   return 0;
}
vaunun
sumber