변수 (Variable)
프로그램에서 데이터를 저장하기 위해 사용되는 것.
데이터의 위치와, 해석방법, 식별자(변수명)의 조합이며.
이 정보들은 함께 묶여서 컴파일 타임에 심볼 테이블에 저장된다.
데이터 위치
데이터를 저장하기 위해서는 사용되지 않는 RAM 공간에 데이터를 적재해야 한다.
성공적으로 적재했다면 해당 메모리의 위치를 기억해야 할 필요가 있는데,
데이터가 어디있는지 모른다면, 데이터를 잃어버린 것과 똑같기 때문이다.
C++은 심볼 테이블(Symbol Table)에 각 변수명과 메모리 위치, 자료형을 함께 적어놓는데.
변수에 접근할 때 마다, 심볼 테이블을 거쳐 메모리의 위치를 가져오게 된다.
int data1; double data2;
데이터 해석방법
RAM은 모든 데이터를 이진수(비트열)로 저장하는데,
외부에서 보면 대충 이런 느낌이다.
위치를 알아도 크기와 해석방법을 모른다면 무엇을 의미하는지 알 수 없는데.
파일이름에 확장자가 없어서, 어떤 파일인지 알 수 없는 상황과 같다.
자료형은 마치 파일의 확장자처럼,
데이터의 크기와 비트열의 해석방법을 제공한다.
데이터 저장방식 (Byte Order)
1Byte(8bit)를 넘는 원시 데이터는 아키텍쳐마다 RAM에 저장되는 방식이 다르다.
- 빅 에디안 : 1바이트씩 자르고 RAM에 정순으로 저장.
- 리틀 에디안 : 1바이트씩 자르고 RAM에 역순으로 저장.
#include <iostream> #include <cstdio> int main() { // 메모리에 0x12345678을 대입한다. int32_t n = 0x12345678; // 시작점에서 1바이트씩 출력한다. char* c = (char*)(void*)&n; for(int i=0; i<sizeof(n); i++){ printf("0x%2X " , c[i]); } }
<실행결과>
0x12 0x34 0x56 0x78 (빅 에디안)
또는
0x78 0x56 0x34 0x12 (리틀 에디안)
변수 식별자
변수를 구별해낼 수 있는 정보를 의미하며, 여기서는 변수이름과 같다.
식별자(변수명)를 사용하면 심볼 테이블에서 위치와 자료형을 얻어오고 해석결과와 연결시키는데,
이것이 해당 변수에 저장된 값을 가져오는 과정이다.
#include <iostream> int main() { int32_t a; a = 12345; // a는 12345로 해석됨. std::cout << a << std::endl; }
<실행결과>
12345
생각해보기 (1) : 숫자로된 Hello, World!
C++에서 문자열은 아스키 코드를 이어붙이고, 마지막에 0을 집어넣은 것 이다.
아래 코드에서 알맞은 숫자를 넣어 "Hello, World!"를 만들어보자.
어떤 에디안을 사용하는지에 따라 정답이 다르다.
#include <iostream> int main() { // "Hello, World!" 문자열을 만들어보자. int64_t number[2]; number[0] = ?; number[1] = ?; // 문자열로 캐스팅한 뒤, 콘솔에 출력한다. auto* word = (const char*)(void*)number; std::cout << word << std::endl; }
<실행결과>
Hello, World!
'# Lang > C++' 카테고리의 다른 글
2.2 자료형과 데이터 해석 (0) | 2019.03.27 |
---|---|
2.1 자료형 (0) | 2019.03.26 |
1.3 변수와 메모리 모델 (0) | 2019.03.23 |
1.2 변수의 생성 (0) | 2019.03.21 |
모던 C++14(17) 학습목차 (0) | 2019.03.20 |