[c++] 간단한 질문 있습니다

조회수 597회

안녕하세요

1

char test = 1;
std::cout << test << std::endl;

뉴라인만 찍히는데

char는 8bits 고 int는 32bits여서 데이터손상이 발생하는 것 같은데..

제생각엔 쓰레기값이라도 찍혀야 될것 같은데... 정말 아무것도 안찍혀서 왜그런지 궁금합니다

2

    long test2[3];
    std::cout << test2[0] << std::endl; //0
    std::cout << test2[1] << std::endl; //0
    std::cout << test2[2] << std::endl; //쓰레기값

왜 처음두개가 0이 나오는지 궁금합니다

1 답변

  • 좋아요

    3

    싫어요
    채택 취소하기

    일단 1번 질문부터 보죠

    아래의 코드는 cling 이라는 c++ 인터프리터에서 실행한 결과입니다. cling 은 clang 기반이며 clang은 C++11, C++14 and C++17 를 지원합니다. 간단히 c++의 표준을 잘 지키고 있는 컴파일러입니다.

    [cling]$ #include <iostream>
    [cling]$ char test = 97
    (char) 'a'
    [cling]$ std::cout << test << std::endl
    a
    (std::basic_ostream<char, std::char_traits<char> >::__ostream_type &) @0x7fa1145c2e40
    [cling]$ char test2 = 1
    (char) '0x01'
    [cling]$ std::cout << test2 << std::endl
    
    (std::basic_ostream<char, std::char_traits<char> >::__ostream_type &) @0x7fa1145c2e40
    

    char 에 정수를 대입시 ascii 코드로 매칭됩니다.

    아스키코드표를 보시기 바랍니다.

    97 은 소문자 a이며 65 는 대문자 A가 됩니다. 그럼 1은?

    아스키코드표를 보세요. ctrl+a 문자라고 합니다.

    1번은 이해가 되었을 겁니다.

    사실 2번 질문이 어려울 수 있습니다.

    c/c++ 등의 언어에서 변수를 저장시 스택이라는 메모리 공간을 사용합니다.

    문제는 이 스택을 사용할 때 초기화는 하지 않습니다. 그냥 변수에 값을 대입시 덮어쓰는 구조입니다.

    즉 초기화를 하지 않는 변수는 이상한 값이 들어있을 수 있습니다. (해당 메모리 번지에 이미 값이 존재하고 있는 겁니다.)

    나중에...디버거를 다룰 수 있게 되면 각 메모리의 값을 살펴보고...이해할 수 있고 더 좋은 방법은 어셈블리 언어를 공부할 때 명확하게 이해할 수 있을 겁니다.

    c/c++언어를 잘 이해하기 위해서는 어셈블리를 꼭 공부해야 합니다.

    • 답변 감사합니다! 최진우 2019.4.3 10:29

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)