2009-01-26 41 views

Trả lời

145

Sử dụng:

#include <iostream> 

... 

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

many other options to control the exact formatting of the output number, chẳng hạn như số không hàng đầu và chữ hoa/thấp hơn.

+21

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

+7

@ShreevatsaR Một vấn đề với việc khôi phục số thập phân trên hex là tháng mười hai 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] (http://stackoverflow.com/q/2273330/461834) 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 bằng 'ios :: fmtflags f (cout.flags());' và khôi phục nó bằng 'out.flags (f);'. – jtpereyda

33

std::hex được xác định 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>.

31

Để thao tác các dòng để in trong hệ thập lục phân sử dụng hex thao túng:

cout << hex << a; 

Theo mặc định các nhân vật thập lục phân được xuất ra dưới dạng chữ thường. Để thay đổi nó để sử dụng chữ hoa các uppercase thao túng:

cout << hex << uppercase << a; 

để sau đó thay đổi sản lượng trở lại chữ thường, sử dụng nouppercase thao túng:

cout << nouppercase << b; 
7

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 nó là giá trị để chỉ ra làm thế nào để làm điều đó với printf. Tôi gần như luôn luôn thích sử dụng nó hơn std :: cout (thậm chí 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.

+2

Từ lâu đã là một trận chiến printf vs cout. Tất nhiên, cout có tài sản tốt đẹp mà nó xuất phát từ ostream 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 dòng và do đó printf và fprintf là 2 lệnh khác nhau. Thực sự, nó sẽ tốt đẹp trong C nếu stdout là một FILE *. Sẽ làm mọi thứ dễ dàng hơn. – rlbond

+8

@rlbond stdout là một FILE * trong C. –

+2

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

7

Có nhiều loại cờ khác nhau & mặt nạ bạn cũng 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; 
} 
+3

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 chuẩn) và chỉ đặt ios :: hex. Khi ios :: hex không được đặt, mọi bit trong ios :: basefield không được đặt. Làm thế nào nó num in lần thứ hai?bằng chứng cho thấy tất cả các bit đều chưa được đặt: http://ideone.com/fYXyh6. Điều này được phép cho ios :: floatfield theo tư duy trong C++ vol 2 trang 189, nhưng nó không nói giống nhau về ios :: basefield. –

10

Nếu bạn muốn in một số hex duy nhất, và sau đó quay trở lại thập phân, bạn có thể sử dụng này: std::cout << std::hex << num << std::dec << std::endl;

Các vấn đề liên quan