ค่าฐานสิบหก c ++ cout?


144

ฉันต้องการทำ:

int a = 255; 
cout << a;

และให้มันแสดง FF ในผลลัพธ์ฉันจะทำสิ่งนี้ได้อย่างไร

คำตอบ:


201

ใช้:

#include <iostream>

...

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

มีตัวเลือกอื่น ๆ อีกมากมายเพื่อควบคุมการจัดรูปแบบที่แน่นอนของหมายเลขเอาต์พุตเช่นศูนย์นำหน้าและตัวพิมพ์ใหญ่ / ตัวพิมพ์เล็ก


34
ดูเหมือนว่าจะเปลี่ยนเอาท์พุทในอนาคตทั้งหมดจากศาลเป็นฐานสิบหก ดังนั้นหากคุณต้องการพิมพ์ 'a' ในรูปแบบ hex คุณอาจต้องการcout << hex << a << dec;ให้มันเปลี่ยนกลับ
ShreevatsaR

16
@ShreevatsaR ปัญหาอย่างหนึ่งของการคืนค่า dec บน hex คือ dec อาจไม่ได้เป็นค่าที่ตั้งไว้ก่อนหน้านี้โดยเฉพาะอย่างยิ่งถ้าคุณกำลังเขียนวิธีไลบรารีทั่วไป คำถามนี้มีคำตอบบางอย่างเกี่ยวกับวิธีจัดเก็บและกู้คืนสถานะ คุณสามารถบันทึกรัฐที่มีและเรียกคืนด้วยios::fmtflags f(cout.flags()); out.flags(f);
jtpereyda

จากนั้นคืนค่าโดยstd::cout.flags(f);
trueadjustr

43

std::hexถูกกำหนดไว้ในที่มีอยู่โดย<ios> <iostream>แต่การใช้สิ่งต่าง ๆ เช่นstd::setprecision/std::setw/std::setfill/ etc คุณต้องรวม<iomanip>ไว้ด้วย


42

หากต้องการจัดการกระแสข้อมูลให้พิมพ์เป็นเลขฐานสิบหกให้ใช้เครื่องมือhexปรับแต่ง:

cout << hex << a;

โดยดีฟอลต์อักขระเลขฐานสิบหกจะถูกส่งออกเป็นตัวพิมพ์เล็ก หากต้องการเปลี่ยนเป็นตัวพิมพ์ใหญ่ให้ใช้ตัวuppercaseจัดการ:

cout << hex << uppercase << a;

หากต้องการเปลี่ยนเอาต์พุตกลับเป็นตัวพิมพ์เล็กในภายหลังให้ใช้เครื่องมือnouppercaseปรับแต่ง:

cout << nouppercase << b;

2
คือnouppercaseจะเปลี่ยนกลับมาส่งออกไปยังทศนิยม?
Cœur

เพียงเพิ่มโน้ตเบ็ดเตล็ดข้อมูลโค้ดด้านบนจะไม่ทำให้ "apple" กลายเป็น "APPLE" ที่ป้อนเข้า
trueadjustr

20

หากคุณต้องการพิมพ์เลขฐานสิบหกเดียวแล้วเปลี่ยนกลับเป็นทศนิยมคุณสามารถใช้สิ่งนี้:

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

13

ฉันเข้าใจว่านี่ไม่ใช่สิ่งที่ OP ร้องขอ แต่ฉันก็ยังคิดว่ามันคุ้มค่าที่จะชี้ให้เห็นว่าต้องทำอย่างไรกับ printf ฉันมักจะชอบใช้มันมากกว่า std :: cout (แม้จะไม่มีพื้นหลัง C ก่อนหน้า)

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

'2' กำหนดความแม่นยำ 'X' หรือ 'x' กำหนดกรณีและปัญหา


4
มีการต่อสู้กับ printf vs cout มานานแล้ว แน่นอนศาลมีคุณสมบัติที่ดีที่มันมาจาก ostream และได้รับประโยชน์ที่เป็นนามธรรม C ไม่มีแนวคิดเกี่ยวกับวัตถุสตรีมดังนั้น printf และ fprintf จึงมี 2 คำสั่งต่างกัน จริง ๆ มันคงดีใน C ถ้า stdout เป็นไฟล์ * จะทำให้สิ่งต่าง ๆ ง่ายขึ้น
rlbond

11
@rlbond stdout เป็นไฟล์ * ใน C.
Étienne

4
ซึ่งเป็นเหตุผลที่เทียบเท่ากับprintf("hello\n") fprintf(stdout, "hello\n")มีประโยชน์มากขึ้นคุณสามารถส่งstdout(หรือstdinหรือstderr) ไปยังฟังก์ชันที่รับFILE*อาร์กิวเมนต์ได้
Keith Thompson

11

มีธงและหน้ากากหลายแบบที่คุณสามารถใช้ได้เช่นกัน โปรดดูhttp://www.cplusplus.com/reference/iostream/ios_base/setf/สำหรับข้อมูลเพิ่มเติม

#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
ฉันคิดว่าพฤติกรรมของรหัสนี้ไม่ได้กำหนด setf จะล้างบิตของ ios :: basefield รวมถึง ios :: dec (ค่าเริ่มต้นสำหรับสตรีมมาตรฐาน) และตั้งค่าเฉพาะ ios :: hex เมื่อ ios :: hex ไม่ได้ตั้งค่าทุก ๆ บิตใน ios :: basefield จะถูก unset num พิมพ์ครั้งที่สองอย่างไร หลักฐานที่แสดงว่าบิตที่มีทั้งหมดล้าง: ideone.com/fYXyh6 สิ่งนี้ได้รับอนุญาตสำหรับ ios :: floatfield ตามการคิดใน C ++ vol 2 หน้า 189 แต่มันไม่ได้พูดเหมือนกันเกี่ยวกับ ios :: basefield
Joel Sjögren

10

std::hex ทำให้คุณได้รับการจัดรูปแบบเลขฐานสิบหก แต่เป็นตัวเลือก stateful หมายถึงคุณต้องบันทึกและเรียกคืนสถานะมิฉะนั้นจะส่งผลกระทบต่อผลลัพธ์ในอนาคตทั้งหมด

การสลับกลับอย่างไร้เดียงสาstd::decเป็นสิ่งที่ดีถ้านั่นคือสิ่งที่เคยมีมาก่อนซึ่งอาจไม่เป็นเช่นนั้นโดยเฉพาะอย่างยิ่งถ้าคุณกำลังเขียนห้องสมุด

#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

นี้รวมคำตอบและข้อมูล Greg Hewgill จากคำถามอื่น


2

ใช้std::uppercaseและstd::hexเพื่อจัดรูปแบบตัวแปรจำนวนเต็มที่aจะแสดงในรูปแบบเลขฐานสิบหก

#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;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.