[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 답변
-
일단 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++언어를 잘 이해하기 위해서는 어셈블리를 꼭 공부해야 합니다.
댓글 입력