C ++ cout 16 진수 값?


144

나하고 싶어:

int a = 255; 
cout << a;

출력에 FF를 표시하면 어떻게해야합니까?

답변:


201

사용하다:

#include <iostream>

...

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

선행 0 및 대소 문자와 같이 출력 번호의 정확한 형식을 제어하는 ​​다른 옵션많이 있습니다 .


34
이것은 미래의 모든 산출물을 cout에서 hex로 바꾸는 것처럼 보입니다. 따라서 'a'만 16 진수로 인쇄 cout << hex << a << dec;하려면 다시 변경하는 것이 좋습니다.
ShreevatsaR

16
@ShreevatsaR dec over hex를 복원하는 데있어 한 가지 문제점은 dec가 이전에 설정된 값이 아닐 수 있다는 것입니다. 특히 일반 라이브러리 메소드를 작성하는 경우에 그러합니다. 이 질문 에는 상태를 저장하고 복원하는 방법에 대한 답변 있습니다. 로 상태를 저장 ios::fmtflags f(cout.flags());하고로 복원 할 수 있습니다 out.flags(f);.
jtpereyda

그 다음으로 복원std::cout.flags(f);
truthadjustr

43

std::hex에 포함 된로 정의 <ios>됩니다 <iostream>. 그러나 std::setprecision/std::setw/std::setfill/ etc 와 같은 것을 사용 하려면 포함해야합니다 <iomanip>.


42

16 진수로 인쇄 할 스트림을 조작하려면 조작기를 사용하십시오 hex.

cout << hex << a;

기본적으로 16 진 문자는 소문자로 출력됩니다. 대문자로 변경하려면 uppercase조작기를 사용하십시오 .

cout << hex << uppercase << a;

나중에 출력을 다시 소문자로 변경하려면 nouppercase조작기를 사용하십시오 .

cout << nouppercase << b;

2
가요 nouppercase진수로 출력 다시 변경하려고?
Cœur

기타 메모를 추가하기 위해 위의 스 니펫은 입력 "apple"을 "APPLE"로 만들지 않습니다.
truthadjustr

20

단일 16 진수를 인쇄 한 다음 10 진수로 되돌리려면 다음을 사용할 수 있습니다.

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

13

나는 이것이 OP가 요구 한 것이 아니라는 것을 이해하지만, 여전히 printf로 그것을하는 방법을 지적 할 가치가 있다고 생각합니다. 나는 항상 std :: cout (이전 C 배경이 없어도)보다 그것을 사용하는 것을 선호합니다.

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

'2'는 정밀도를 정의하고 'X'또는 'x'는 대소 문자를 정의합니다.


4
오랫동안 printf 대 cout 전투가있었습니다. 물론, cout은 ostream에서 파생되어 모든 추상화 이점을 얻는 훌륭한 속성을 가지고 있습니다. C는 스트림 객체 개념이 없으므로 printf와 fprintf는 서로 다른 두 가지 명령입니다. stdout이 FILE *이라면 실제로 C에서는 좋았을 것입니다. 일을 더 쉽게 만들었을 것입니다.
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 :: dec (표준 스트림의 기본값)을 포함하여 ios :: basefield 비트를 지우고 ios :: hex 만 설정합니다. ios :: hex가 설정 해제되면 ios :: basefield의 모든 비트가 설정 해제됩니다. 두 번째로 인쇄 된 숫자는 어떻게됩니까? 비트가 모두 설정되지 않았다는 증거 : ideone.com/fYXyh6 . 이것은 C ++ vol 2 페이지 189의 Thinking in C ++ vol 2 페이지에 따라 ios :: floatfield에 허용되지만 ios :: basefield에 대해서는 동일하게 언급되지 않습니다.
Joel Sjögren

10

std::hex 16 진 형식을 가져 오지만 상태 저장 옵션으로 상태를 저장하고 복원해야합니다. 그렇지 않으면 이후의 모든 출력에 영향을 미칩니다.

순진하게 다시 전환 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::uppercasestd::hex형식 정수 변수에는 a16 진수 형식으로 표시합니다.

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