5. Basic values and data

C 프로그램은 데이터를 다룬다.

Takeaway 1.5.0.1. C 프로그램은 값의 표현보다는 값에 대해 추론한다.

5.1. The abstract state machine.

C 프로그램은 값을 다룬다고 할 수 있다. 모든 값이 관찰가능한 것은 아니며 관찰가능하기 위해서는 주소가 지정된 메모리에 값이 존재해야 한다. C 컴파일러는 일련의 프로세스를 최적화해 지름길을 택할 수 있다. 이 때 컴파일러는 관찰가능한 상태만을 고려하며 이런 메커니즘을 추상 상태 기계라고 한다. 이를 설명하기 위해서는 (어떤 상태에 진입했는지), 타입 (이 상태가 무엇을 나타내는지), 표현 (이 상태가 어떻게 구분되어지는지) 에 대해 이해할 필요가 있다.

5.1.1. Values.

C에서의 은 추상적 존재이다.

Takeaway 1.5.1.1. 모든 값들은 숫자이거나 숫자로 번역된다.

C에서의 데이터는 특정 시점에서의 모든 오브젝트의 값의 집합이다.

C에서의 상태는 실행 파일, 실행 지점, 데이터, I/O와 같은 외부 간섭에 의해 결정된다. 플랫폼 독립성은 타입을 통해 얻는다.

5.1.2. Types.

Takeaway 1.5.1.2. 모든 값은 정적으로 정해진 타입을 갖는다.

Takeaway 1.5.1.3. 값에 대해 가능한 연산들은 그 타입에 의해 정해진다.

Takeaway 1.5.1.4. 값의 타입은 연산의 결과를 결정한다.

5.1.3. Binary representation and the abstract state machine.

컴퓨터마다 플랫폼이 다르기 때문에 C 표준은 타입별로 연산의 결과를 전부 명시화할 수는 없다. 정해진 플랫폼에서 특정 타입의 특정 값에 대한 표현 방식을 이진 표현이라 하자.

Takeaway 1.5.1.5. 타입의 이진 표현은 모든 연산의 결과를 결정한다.

Takeaway 1.5.1.6. 타입의 이진 표현은 관측 가능하다.

이진 표현도 추상 표현이지 오브젝트 표현은 아니다.

값, 타입, 이진 표현이 정해지면 모든 계산을 할 수가 있다. 이를 추상 상태 기계라 한다.

Takeaway 1.5.1.7. (as-if) 프로그램은 해당 추상 상태 기계를 따르는 것처럼 동작한다.

5.1.4. Optimization.

대부분의 C 컴파일러들은 코드의 명령문을 정확히 따르지 않는다. 컴파일러는 추상 상태 기계에서 할 수 있는 가정에 따라 코드들을 최적화한다. 그러나 이러한 최적화는 프로그램이 종료되지 않을 것이라는 가정을 할 수 있어야만 가능하다. 그렇지 않다면 최적화는 수행될 수 없다.

Takeaway 1.5.1.8. 타입은 최적화 기회를 결정한다.

5.2. Basic types.

C에는 기본 자료형과 파생 자료형이 있다. 파생 자료형은 나중에 다룬다.

숫자 자료형에는 2개의 종류가 있으며 각각 종류마다 또 2가지 종류가 있다. 비부호 정수형, 부호 정수형, 실 부동소수형, 복소 부동소수형.

6개의 좁은 자료형 (_Bool, unsigned char, unsigned short, char, signed char, signed short)은 직접 산술 연산을 할 수가 없고 더 넓은 기본형으로 승격된다.

Takeaway 1.5.2.1. 산술 연산 중 좁은 정수형은 signed int로 승격된다.

Takeaway 1.5.2.2. 기본 숫자 자료형 4종은 각각 3개의 승격되지 않은 타입을 갖는다.

세간의 믿음과 달리 C 표준은 이 12 타입의 정밀도를 규정하지 않는다. 이는 구현체에 달려 있다.

Takeaway 1.5.2.3. 크기, 기수, 서수에는 size_t를 쓴다.

Takeaway 1.5.2.4. 음수일 수 없는 작은 양에는 unsigned를 쓴다.

Takeaway 1.5.2.5. 음수일 수 있는 작은 양에는 signed를 쓴다.

Takeaway 1.5.2.6. 음수일 수 있는 큰 양에는 ptrdiff_t를 쓴다.

Takeaway 1.5.2.7. 부동 소수점 연산에는 double을 쓴다.

Takeaway 1.5.2.8. 복소수 연산에는 double complex를 쓴다.

5.3. Specifying values.

숫자 상수(리터럴)은 다음과 같이 특정될 수 있다.

10진 정수 상수, 8진 정수 상수, 16진 정수 상수, 10진 부동소수형 상수, 16진 부동소수형 상수, 정수형 문자 상수, 문자열 리터럴

Takeaway 1.5.3.1. 연속된 문자열 리터럴은 이어붙어질 수 있다.

Takeaway 1.5.3.2. 숫자 리터럴은 음수일 수 없다.

Takeaway 1.5.3.3. 10진 정수 상수는 부호가 있다.

Takeaway 1.5.3.4. 10진 정수 상수는 3종류의 부호 정수형 중 가장 작으면서 크기가 맞는 타입을 갖는다.

Takeaway 1.5.3.5. 같은 값이어도 다른 타입일 수 있다.

Takeaway 1.5.3.6. 음수를 표현하기 위해 8진이나 16진 상수를 사용하지 마라.

Takeaway 1.5.3.7. 음수를 표현하려면 10진 상수를 써라.

Takeaway 1.5.3.8. 다른 리터럴이어도 같은 값일 수 있다.

Takeaway 1.5.3.9. 10진 부동소수형 상수의 유효값은 리터럴값과 다를 수 있다.

Takeaway 1.5.3.10. 리터럴은 값, 타입, 이진 표현을 갖는다.

5.3.1. Complex constants.

Takeaway 1.5.3.11. I는 허수단위로 보존되어 있다.

컴파일러는 두 타입이 섞였을 때 넓은 타입으로 변환시킨다.

5.4. Implicit conversions.

Takeaway 1.5.4.1. 단항 -와 +가 붙으면 승격된 타입이 된다.

Takeaway 1.5.4.2. 버림 형변환을 피하라.

Takeaway 1.5.4.3. 산술 연산에 좁은 자료형을 쓰지 마라.

Takeaway 1.5.4.4. 서로 다른 부호끼리 연산을 하지 마라.

Takeaway 1.5.4.5. 가능하면 비부호 정수형을 써라.

Takeaway 1.5.4.6. 묵시적 형변환이 해가 없도록 자료형을 선택하라.

5.5. Initializers.

Takeaway 1.5.5.1. 모든 변수는 초기화되어야 한다.

Takeaway 1.5.5.2. 집합 자료형에 대해서는 지정 초기화자를 쓴다.

모르겠으면 기본 초기화자 = {0}을 쓰면 된다.

Takeaway 1.5.5.3. 가변 길이 배열이 아닌 모든 경우 ={0}은 올바른 초기화자이다.

지정 초기화자에서 초기화를 빠트린 원소들의 초기화 순서는 선언 순서와 동일하다.

5.6. Named constants

Takeaway 1.5.6.1. 특정한 의미가 있는 상수는 이름지어져야 한다.

Takeaway 1.5.6.2. 다른 의미를 가진 상수는 구별되어야 한다.

5.6.1. Read-only objects.

상수를 const 한정자 변수와 혼동하지 말자.

Takeaway 1.5.6.3. const 한정자 오브젝트는 읽기 전용이다.

Takeaway 1.5.6.4. 문자열 리터럴은 읽기 전용이다.

5.6.2. Enumerations.

C는 작은 정수형을 나열해 이름붙일 때 쓰이는 열거형을 제공한다.

Takeaway 1.5.6.5. 열거형 상수는 명시적인 값이나 인덱스 값을 가진다.

Takeaway 1.5.6.6. 열거형 상수는 signed int 타입이다.

열거형 상수에는 태그가 필요 없다. 초기화 시에는 정수형 상수 표현식으로 초기화해야 한다.

Takeaway 1.5.6.7. 정수형 상수 표현식은 오브젝트를 평가하지 않는다.

5.6.3. Macros.

C 프로그램은 텍스트 치환을 하는 매크로를 제공한다. 이는 전처리기 #define을 통해 쓰인다.

Takeaway 1.5.6.8. 매크로 명은 전부 대문자로 쓴다.

5.6.4. Compound literals.

상수 리터럴이 없는 자료형에 대해서는 복합 리터럴을 쓴다.

Takeaway 1.5.6.9. 복합 리터럴은 오브젝트를 정의한다.

Takeaway 1.5.6.10. 매크로 끝에 종료 세미콜론을 숨기지 말라.

Takeaway 1.5.6.11. 매크로 내의 줄이음 문자들의 우측 정렬을 맞춰라.

5.7. Binary representations.

이진 표현은 타입의 값에 대한 모델링이다. 메모리 내의 오브젝트 표현과는 다를 수 있다.

Takeaway 1.5.7.1. 같은 값이어도 다른 이진 표현을 가질 수 있다.

5.7.1. Unsigned integers.

Takeaway 1.5.7.2. 비부호 정수형의 사칙연산은 잘 정의된다.

비부호 정수형의 이진 표현은 \sum_{i=0}^{p-1} b_{i}2^{i} 로 표현된다. 이 때 b_i는 비트, p는 정밀도, b_0은 최하위 비트, b_(p-1)은 최상위 비트이다. 1인 비트 중 최하위/최상위 비트는 최하위 비트셋, 최상위 비트셋이다.

Takeaway 1.5.7.3. 정수형의 최대값은 2^p – 1이다.

Takeaway 1.5.7.4. 비부호 정수형의 사칙연산은 그 정밀도에 의해 결정된다.

5.7.2. Bit sets and bitwise operators.

비트 연산자 |, &, ^는 비트 집합 내에서 합집합, 공집합, 대칭차를 나타낸다. 비트 세트는 플래그에 주로 쓰인다.

5.7.3. Shift operators.

Takeaway 1.5.7.5. 비트 시프트 연산의 두 번째 피연산자는 정밀도보다 작아야 한다.

5.7.4. Boolean values.

C의 불 타입은 비부호 정수형이다.

5.7.5. Signed integers.

Takeaway 1.5.7.6. 양수는 부호와 상관없이 표현된다.

부호 정수형은 부호 비트를 갖는다. C에서는 부호 표현시에 부호-크기 표현, 1의 보수 표현, 2의 보수 표현의 3가지 방식을 허용하나, 2의 보수 표현식이 절대적으로 많이 쓰인다.

부호 정수형의 오버플로우는 정의되지 않은 행동이다.

Takeaway 1.5.7.7. 추상 상태 기계가 정의되지 않은 상태에 도달한다면 프로그램의 실행을 위한 가정을 더 이상 이어나갈 수 없다.

Takeaway 1.5.7.8. 모든 연산에 있어서 정의되지 않은 행동을 방지하는 것은 프로그래머의 책임이다.

Takeaway 1.5.7.9. 부호 정수형은 당신을 함정에 빠트릴 수 있다.

Takeaway 1.5.7.10. 2의 보수 표현에서 INT_MIN < -INT_MAX이다.

Takeaway 1.5.7.11. 부호 정수형의 단항 – 연산자는 오버플로우를 일으킬 수 있다.

Takeaway 1.5.7.12. 비트 연산에는 비부호 정수형을 써라.

5.7.6. Fixed-width integer types.

C 표준은 고정 폭 정수형을 제공한다.

Takeaway 1.5.7.13. uintN_t 타입이 제공될 경우 그것은 정확히 N 비트의 폭과 정밀도를 가진 비부호 정수형이다.

Takeaway 1.5.7.14. intN_t 타입이 제공될 경우 그것은 2의 보수 표현에서 N비트의 폭과 N – 1비트의 정밀도를 가진 부호 정수형이다.

Takeaway 1.5.7.15. N = 8, 16, 32, 64에 대해 위의 특성이 제공된다면, 그에 맞는 타입 intN_t와 uintN_t도 제공되어야 한다.

Takeaway 1.5.7.16. 모든 고정 폭 정수형에 대해, _MIN (부호 정수형 한정), _MAX 매크로와 _C 리터럴이 제공되어야 한다.

5.7.7. Floating-ponit data.

C에서 부동소수형은 부호, 지수, 가수로 표현된다.

Takeaway 1.5.7.17. 부동 소수형 연산은 교환법칙, 결합법칙, 분배법칙 그 어느 것도 만족할 필요가 없다.

Takeaway 1.5.7.18. 절대로 부동 소수형을 ==, !=로 비교하지 말라.

요점 정리

  • C 프로그램은 그것이 실행되는 컴퓨터에 의존적이지 않은 추상 상태 기계에서 구동된다.
  • 모든 기본 C 자료형은 숫자들이지만, 그것이 전부 산술 연산에 쓰일 수 있는 것은 아니다.
  • 값은 타입과 이진 표현을 갖는다.
  • 값의 타입은 필요할 경우 묵시적으로 형변환된다.
  • 변수는 최초로 사용되기 전에 명시적으로 초기화되어야 한다.
  • 정수 연산은 오버플로우가 없는 한 정확한 값을 준다.
  • 부동 소수점 연산은 이진 표현으로 일정한 자리수만큼 표현할 수 있는 근사값만을 준다.

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중