리메이크 중/C,C++ 이론 중심

C(&C++) 이론 7. 변수 선언과 기본 데이터 타입

라이피 (Lypi) 2022. 12. 31. 17:57
반응형

 


내용 참고

C++ 기초플러스 4판 (성안당)

혼자 연구하는 C/C++ (Soen.kr/와우북스)

Microsoft Docs (구 MSDN)


변수 선언과 기본 데이터 타입

■  앞에서 변수를 선언하는 것을 보여준적이 있다. 

■  이번에는 변수에 대해서 좀 더 자세히 알아보자. 


Ⅰ. 변수 선언

int main()
{
    int a;
    int zero = 0;

    return 0;
}

ⅰ.  변수 선언 방법

■  위의 코드를 실행하면 변수를 선언만하고 한번도 쓰지 않았다는 warning(경고)가 뜰 것이다.

■  하지만 딱히 Error(오류)가 뜨진 않고 실행된다. 

■  즉, 거의 모든 코드에 include문이 들어가긴 하지만 반드시 필요한 건 아니라는 뜻이다.

■  변수 선언은 기본 문법적 내용이기 때문에 변수를 선언하기 전에 필요로 하는 것이 없다.

 

■  C언어와 C++에서 변수를 선언하는 방법은 동일하다.

■  자료형 변수명 ;(세미콜론) 의 형식으로 선언하면 된다.

■  변수명을 정할 때의 주의 사항이 몇가지 있다.

■  이는 변수명 뿐 아니라 추후에 함수명 등을 지을 때도 동일하게 적용된다.

ⅱ.  변수명 선언시 주의사항 (명명시 주의사항)

■  C 및 C++은 대소문자를 구분한다.

■  문법적으로 정해져 있는 키워드(for, while 등)는 변수명으로 사용할 수 없다.

■  변수명에는 영문자, 숫자, _(언더바)만 사용가능하다.

■  변수명의 시작에는 숫자가 올 수 없다.

■  변수명은 띄어쓸 수 없다. 즉, 공백문자가 들어가서는 안된다. 

■  띄어쓰기 대신 _(언더바)을 사용하는 편이다.

 

■  이하는 강제성은 없지만 변수명을 지을 때 지키면 좋은 조언이다.

■  대소문자 구성을 일관되게 하는 것이 좋다. 

■  예를 들어 score와 Score는 다른 변수이므로 변수명의 시작을 대문자로 할지 소문자로 할지등을 정해두는 것이 좋다.

■  사용처나 의미를 명확하게 알 수 있게 짓는 편이 좋다.

■  영어가 약하고 개인 프로젝트라면 score보다 jumsoo가 개인에게는 더 좋을 수도 있다.

■  컴파일러에 따라 구분 가능한 길이 제한이 있으니 너무 긴 이름보다는 3글자에서 10글자 정도로 짓는것이 좋다.

■  너무 길면 오타를 낼 확률이 높아지고 기억하기 힘들수 있다.

 

ⅲ.  자주  쓰이는 명명규칙

■  세계적으로 많이 사용되는 명명법 규칙이 있으므로 필요하다면 이를 따르는 것도 방법이다.

 

■  카멜 표기법 : 첫단어의 시작은 소문자로 하고, 그 이후 연결된 단어의 시작은 대문자로 하는 방법

■  ex ) helloWorld, studentNumber 등

■  주로 변수명이나 함수명에 많이 사용한다.

 

■  스네이크 표기법 : 모든 문자를 소문자로 표기하고, 단어 연결시에 _(언더바)를 사용하는 방법

■  ex ) hello_world, student_number 등

■  주로 변수명이나 함수명 그리고 사용자 지정 데이터 타입이나 이름 공간에 많이 사용한다.

 

■  파스칼 표기법 : 모든 단어의 시작을 대문자로 하는 방법

■  ex ) HelloWorld, StudentNumber 등

■  주로 클래스 명에 많이 사용한다.

 

■  헝가리안 표기법 : 변수의 앞에 데이터 타입을 약자로 붙이는 방법

■  ex ) strHelloWorld, iStudentNumber 등

■  사용자 정의 자료형은 알아보기 힘들고 지금은 컴파일러에서 자료형을 알아볼 수 있는 방법이 많아서 잘 쓰이지 않는다.

 


Ⅱ. 정수형 데이터 타입

ⅰ. 정수형 형식 지정자의 구성

■ 부호 형식 지정자 + 범위 형식 지정자 + int 

■ 부호 형식 지정자 : signed(부호 있는), unsigned(부호 없는)

■ 범위 형식 지정자 : short, long, long long

■ 각각의 형식 지정자들은 생략 가능하기 때문에 같은 형식을 나타내는 다른 표현들이 존재한다.

 

 

■ 형식간의 크기 관계 : 1byte == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)

■ C나 C++ 표준에는 형식들의 최소 표현 범위와 크기 관계만 지정되어 있을 뿐 정확한 크기는 지정되어 있지 않다.

■ 이러한 애매함은 데이터 통신 등을 할 때는 문제가 되기 때문에 C99 표준에서 stdint.h 헤더 파일이 추가되었다. 


ⅱ. 양수를 표현하는 방법

■ 2진수 값으로 정수를 저장하고 표현하는 형식이다.

■ 메모리의 크기에 따라서 표현할 수 있는 값의 범위가 달라진다.

■ 1byte는 8비트이므로 1바이트로 양수만 표현한다고 가정하면 0부터 28=256까지의 수를 표현할 수 있다.


ⅲ. 정수에서 음수를 표현하는 방법

■ 2진수로 음수를 표현하는 방법은 여러가지를 생각할 수 있겠지만 대부분의 컴퓨터는 '2의 보수'를 이용하여 음수를 표현한다.

■ '2의 보수'를 음수로 사용하는 방법의 장점은 0을 표현하는 방법이 하나이고, 계산의 결과값이 직관적이라는 점이다.

■ 원래 수에서 일정한 수를 빼는 방법에서 빼주는 값을 바이어스(bias)라고 하며, 값의 범위를 평행이동시키는 것과 같다.

■ 부호 비트를 사용하는 방법은 가장 좌측의 비트(MSB; Most Significant Bit)를 부호를 표시하는 비트로 사용하는 것이다.

■ 이 방법은 직관적이고 간단하지만 0을 표현하는 방법이 2가지가 된다는 단점이 있다. 

■ n의 보수란 숫자 a와 더했을 때 그 값이 n이 되는 값으로 2진수에서 1의 보수는 비트를 반전시킨 것과 같다.

■ 2진수의 1의 보수를 음수로 사용할 경우의 단점도 0을 표현하는 방법이 2가지가 된다는 점이다.

■ 2진수의 2의 보수는 더해서 2가 되는 수로 1의 보수에 1을 더한 값과 같다. 


 

Ⅲ. 실수형 기본 자료형

ⅰ. 실수형 형식 지정자의 종류

■ 종류 및 크기 관계 : sizeof(float) <=  sizeof(double) <= sizeof(long double)

■ C및 C++에서 실수는 항상 부호있는 수로 정의된다.

■ C 및 C++ 표준에서 각 형식 지정자의 크기를 명시적으로 정의하고 있지는 않다.

ⅱ. 실수를 표현하는 방법

■ 컴퓨터에서 실수를 표현하는 방법은 '고정 소수점 방식'과 '부동(浮動) 소수점 방식'의 2가지를 생각해볼 수 있다.

■ 이때 두 방식 모두 메모리의 한계 때문에 소수부를 무한하다고 가정하는 수학의 소수와 비교할 때 오차가 생긴다.

■ '고정 소수점 방식'은 십진수로 표현되어 있는 수를 그대로 2진수로 변환한 뒤 정수부와 소수부로 나누어서 표현하는 방식이다.

■ '부동 소수점 방식'은 소수점의 위치가 고정되어 있지 않다는 뜻이다. 

■  소수점이 떠다닌다는 뜻이므로 한국어 번역을 차라리 부유 소수점 방식으로 했으면 어땠을까 싶다.

■ '부동 소수점 방식'에서는 소수를 지수부와 가수부로 나누어 표현하는 방식이며 IEEE-745 국제 표준으로 지정되어 있다.

■ 우리는 실생활에서 실수를 10진수와 고정 소수점 방식으로 표현하는데 익숙하다. 이를 부동 소수점 방식으로 변환하면 다음과 같다.

■ 12345.6789 = 1.23456789 * 104 // 0.00123456789 = 1.23456789 * 10-3

ⅲ. 고정 소수점 방식

■ 부호부 1비트, 정수부 7비트, 소수부 8비트로 고정 소수점 방식을 표현하는 메모리가 있다고 가정하자.

■ 그리고 이 메모리에 47.515625를 저장한다고치면 그 과정은 다음과 같다.

■ 1. 부호를 2진수로 변환한다. (+1 = -10 이므로 부호비트는 0)

■ 2. 47을 2진수로 변환한다. (47 = 25+23+22+21+20 = 1011112)

■ 3. 0.515625를 2진수로 변환한다. (0.515625 = 2-6 + 2-1 = 1000012)

■ 4. 결과 값을 부호부와 정수부, 소수부에 각각 저장한다.

■ 47.515625를 고정 소수점 방식으로 저장하면 0 0101111.1000012가 된다.

■ 이 방식은 구현하기 쉽다는 장점이 있다.

■ 하지만 사용한 비트수 대비 표현가능한 수의 크기나 정밀도가 부동 소수점 방식에 비해서 떨어진다는 단점이 있다.

 

ⅳ. 부동 소수점 방식 ( = 부유 소수점 방식)

■ 부호부 1비트, 지수부 4비트, 가수부 11비트로 부동 소수점 방식을 표현하는 메모리가 있다고 가정하자.

■ 그리고 이 메모리에 47.515625를 저장한다고 치면 그 과정은 다음과 같다.

■ 1. 부호를 2진수로 변환한다. (+1 = -10이므로 부호비트는 0)

■ 2. 47을 2진수로 변환한다. (47 = 25+23+22+21+20 = 1011112)

■ 3. 0.515625를 2진수로 변환한다. (0.515625 = 2-6 + 2-1 = 1000012)

■ 즉, 47.515625를 2진수로 표현하면 101111.1000012이 된다. (부호비트 생략)

■ 4. 소수점 왼쪽에 1이 하나만 남게 한다. 이를 정규화라고 한다. 그럼 1.01111100012 * 25(=1012)이 된다.

■ 2진수를 정규화 할 경우 정수부의 값은 항상 1이므로 가수부에 저장할 때 이 1은 생략한다.

■ 5. 지수에 정해진 bias를 더해준다. bias값은 대략 지수부로 표현할 수 있는 수의 절반 정도이다. 여기서는 7(1112)로 가정한다.

■ 지수부에 bias값을 더해주는 이유는 음수 지수를 표현할 수 있게 하기 위해서이다. 

■ 6. 결과값을 부호부와 지수부, 가수부에 각각 저장한다. 이 때, 남는 비트는 지수부는 왼쪽부터, 가수부는 오른쪽부터 0으로 채운다.

■ 그 결과 47.515625를 부동 소수점으로 표현하면 0 1100 011111000102가 된다.

■ 고정 소수점 방식보다 확실히 복잡하지만 고정 소수점보다 더 큰 수나 높은 정밀도의 수를 저장할 수 있다는 장점이 있다.

■ 예를 들어 246은 부동 소수점 방식으로는 0 1111 111101100002이지만 위와같은 고정 소수점 방식으로는 저장할 수 없다.

반응형