Page 22 -
P. 22

이 코드는 잘 컴파일되며 제대로 동작한다. 대부분의 64비트 플랫폼에서 long의 크기는 64비트                            1

                        다. 만약 long의 크기가 32비트라면(컴파일할 때 -m32 플래그를 붙여 에뮬레이션할 수 있다), 위
                        에 있는 값은 너무 크다. 그러나 프로그램은 (아마도 경고 메시지와 함께) 여전히 컴파일되며 다른                            C+  + 기초
                        값이 할당된다. 예를 들어 여기서는 앞쪽 비트가 버려지게 된다.

                        C++11은 데이터가 손실되지 않음을, 다시 말해서 값들이 축소되지 않음(not Narrowed)을 확인하는
                        초기화를 도입한다. 이는 유니폼 초기화(uniform initialization)나 중괄호 초기화(braced initialization)를 사
                        용하면 되는데, 여기서는 간단히 언급하며 2.3.4절에서 자세히 다룬다. 중괄호 안에 있는 값들은

                        축소할 수 없다.

                        long l = { 1234567890123 };

                        이제 컴파일러는 변수 l이 타겟 아키텍처에서 값을 저장할 수 있는지를 확인할 것이다.

                        컴파일러의 축소 보호는 우리에게 값을 초기화할 때 정밀도를 잃지 않는다는 것을 확인할 수 있
                        게 해준다. 반면 암시적 변환으로 인해 부동소숫점 수를 int로 변환하는 일반적인 초기화는 할 수

                        있다.

                        int i1 = 3.14;      // 축소하지만 컴파일된다. (위험한 부분)
                        int i1n = { 3.14 }; // 축소 오류: 소수 부분이 사라지게 된다.


                        두 번째 줄에 있는 새로운 초기화 형태는 암시적 변환이 부동소수점 수의 소수부를 버리므로 일반
                        적인 초기화를 막는다. 마찬가지로 음수를 부호가 없는 변수나 상수에 할당하는 동작도 기존의 초
                        기화에서는 허용되지만 새로운 형태에서는 금지된다.


                        unsigned u2 = -3;    // 축소하지만 컴파일된다. (위험한 부분)
                        unsigned u2n = {-3}; // 축소 오류: 음수를 가질 수 없다.

                        이전 예제에서 우리는 초기화하는데 리터럴 값들을 사용했고 컴파일러는 특정 값이 해당 타입에

                        서 표현할 수 있는지를 검사한다.

                        float f1 = { 3.14 }; // 괜찮다.

                        3.14라는 값은 모든 이진 부동소수점 형식의 절대 정밀도로 나타낼 수 없지만, 컴파일러는 3.14에

                        가장 가까운 값으로 f1을 설정할 수 있다. double 타입 변수나 (리터럴이 아닌) 상수에서 float
                        타입이 변수로 초기화할 때 표현 가능한 모든 double 값들과 이들이 손실 없는 방식으로 변환할
                        수 있는지를 고려해야 한다.




                                                                                                      033




         모던c++_09.indd   33                                                                     2017-12-11   오전 11:02:55
   17   18   19   20   21   22   23   24   25