C ++ nilai hex cout?


144

Aku ingin melakukan:

int a = 255; 
cout << a;

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

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.


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>.


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;

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;

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.


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;
}

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 .


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;
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.