C ++ giá trị hex cout?


144

Tôi muốn làm:

int a = 255; 
cout << a;

và để nó hiển thị FF trong đầu ra, tôi sẽ làm điều này như thế nào?

Câu trả lời:


201

Sử dụng:

#include <iostream>

...

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

nhiều tùy chọn khác để kiểm soát định dạng chính xác của số đầu ra , chẳng hạn như các số 0 đứng đầu và chữ hoa / chữ thường.


34
Điều này dường như thay đổi tất cả đầu ra trong tương lai từ cout sang hex; vì vậy nếu bạn chỉ muốn 'a' được in thành hex, bạn có thể muốn một cái gì đó muốn cout << hex << a << dec;thay đổi lại.
ShreevatsaR

16
@ShreevatsaR Một vấn đề với việc khôi phục dec trên hex là dec có thể không phải là giá trị được đặt trước đó, đặc biệt nếu bạn đang viết một phương thức thư viện chung. Câu hỏi này có một số câu trả lời về cách lưu trữ và khôi phục trạng thái. Bạn có thể lưu trạng thái với ios::fmtflags f(cout.flags());và khôi phục nó với out.flags(f);.
jtpereyda

Sau đó khôi phục bằngstd::cout.flags(f);
Truthadjustr

43

std::hexđược định nghĩa trong <ios>đó được bao gồm bởi <iostream>. Nhưng để sử dụng những thứ như std::setprecision/std::setw/std::setfill/ etc bạn phải bao gồm <iomanip>.


42

Để thao tác luồng để in theo hệ thập lục phân, hãy sử dụng trình hexthao tác:

cout << hex << a;

Theo mặc định, các ký tự thập lục phân được xuất thành chữ thường. Để thay đổi nó thành chữ hoa, hãy sử dụng trình uppercasethao tác:

cout << hex << uppercase << a;

Để sau đó thay đổi đầu ra trở lại chữ thường, sử dụng trình nouppercasethao tác:

cout << nouppercase << b;

2
nouppercasesẽ thay đổi đầu ra trở lại thập phân?
Cœur

Chỉ cần thêm ghi chú linh tinh, đoạn trích trên sẽ không làm cho "quả táo" đầu vào trở thành "APPLE".
Truthadjustr

20

Nếu bạn muốn in một số hex duy nhất, sau đó hoàn nguyên về số thập phân, bạn có thể sử dụng số này:

std::cout << std::hex << num << std::dec << std::endl;

12

Tôi hiểu đây không phải là những gì OP yêu cầu, nhưng tôi vẫn nghĩ rằng thật đáng để chỉ ra cách thực hiện với printf. Tôi hầu như luôn thích sử dụng nó hơn std :: cout (ngay cả khi không có nền C trước đó).

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

'2' xác định độ chính xác, 'X' hoặc 'x' xác định trường hợp.


4
Từ lâu đã có một trận chiến printf vs cout. Tất nhiên, cout có một tài sản tuyệt vời mà nó có được từ việc phát sóng và nhận được tất cả các lợi ích trừu tượng. C không có khái niệm về các đối tượng luồng và do đó printf và fprintf là 2 lệnh khác nhau. Thực sự, nó sẽ rất tuyệt trong C nếu stdout là một FILE *. Sẽ làm mọi thứ dễ dàng hơn.
rlbond

10
@rlbond stdout là một FILE * trong C.
Étienne

3
Đó là lý do tại sao printf("hello\n")tương đương với fprintf(stdout, "hello\n"). Hữu ích hơn, bạn có thể chuyển stdout(hoặc stdin, hoặc stderr) cho một hàm có FILE*đối số.
Keith Thompson

11

Có nhiều loại cờ và mặt nạ khác nhau mà bạn có thể sử dụng. Vui lòng tham khảo http://www.cplusplus.com/reference/iostream/ios_base/setf/ để biết thêm thông tin.

#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
Tôi nghĩ rằng hành vi của mã này là không xác định. Setf xóa các bit ios :: basefield, bao gồm ios :: dec (mặc định cho các luồng tiêu chuẩn) và chỉ đặt ios :: hex. Khi ios :: hex không được đặt, mọi bit trong ios :: basefield đều không được đặt. Làm thế nào nó num in lần thứ hai? bằng chứng là tất cả các bit đều không được đặt: ideone.com/fYXyh6 . Điều này được cho phép đối với ios :: floatfield theo Thinking trong C ++ vol 2 trang 189, nhưng nó không nói tương tự về ios :: basefield.
Joel Sjögren

10

std::hex giúp bạn định dạng hex, nhưng nó là một tùy chọn trạng thái, có nghĩa là bạn cần lưu và khôi phục trạng thái hoặc nó sẽ ảnh hưởng đến tất cả đầu ra trong tương lai.

Việc chuyển đổi trở lại std::decchỉ thực sự tốt nếu đó là nơi các cờ trước đó, có thể không phải là trường hợp, đặc biệt nếu bạn đang viết thư viện.

#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

Điều này kết hợp câu trả lời và thông tin của Greg Hewgill từ một câu hỏi khác .


2

Sử dụng std::uppercasestd::hexđịnh dạng biến số nguyên asẽ được hiển thị ở định dạng thập lục phân.

#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;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.