2012-05-10 4 views
5

float 변수를 정의하고 부동 소수점으로 변환하여 & 및 &을 얻습니다. 이것이 의미하는 바는 무엇입니까? 변환 후, a 자체의 참조입니까? 왜 두 결과가 다른가요?이것은 무엇을 의미합니까? (int &) a

#include <iostream> 
using namespace std; 
int 
main(void) 
{ 
    float a = 1.0; 
    cout << (float &)a <<endl; 
    cout << (int &)a << endl; 

    return 0; 
} 


thinkpad ~ # ./a.out 
1 
1065353216 
+0

이 숙제가 있습니까? – caskey

답변

14
cout << (float &)a <<endl; 
cout << (int &)a << endl; 

는 첫번째는 같은는 플로트의 상기 비트들을 처리한다. 두 번째 것은 비트를 int처럼 취급합니다. 플로트 1.0 비트는 단지 그것은 기본적으로 동등한의 정수 1065353216.

의 비트 될 일이 :

float a = 1.0; 
int* b = (int*) &a; 
cout << a << endl; 
cout << *b << endl; 

(int &) a가 정수에 대한 참조로 캐스트. 즉, a에 대한 정수 참조. (내가 말했듯이, a의 내용을 정수로 취급합니다.)

편집 : 이제 이것이 유효한지 확인하려고합니다. 나는 그렇지 않다고 생각한다. 그것은 실제 크기보다 작거나 같은 유형에 달려 있습니다.

+4

재미 있습니다.참조 유형으로 캐스팅하는 것이 재 해석 캐스트를 수행하는 것과 실질적으로 동일하다는 것을 알지 못했습니다. –

+0

@OliCharlesworth 당신이 심각하거나 냉소적인지 알 수 없으므로 진지하지 않다면 정교하게 기재하십시오. (이것이 유효한지 아닌지는 확실치 않습니다. 지금까지는 관련없는 유형에 대한 참조를 사용한 적이 없었습니다. 표준에서 아무것도 검색하지는 않지만 많은 행운이 없습니다.) 편집 : 조금 명확하게하기 위해, 내 게시물에서 나는 일어나고있는 일이 무엇인지, 어떤 일이 일어날지를 설명하고 있습니다. 나는 그 대답을 명확히해야한다고 생각합니다. – Corbin

+0

지금, 첫 번째 부분은 이해합니다. 하지만 우리가 참조를 정의 할 때 참조를 초기화해야하기 때문에 (int &) a, 나는 혼란 스럽다. &a = b;처럼이 경우 어떻게 설명할까요? (int &) a는 이제 정수 참조이지만, 참조하는 변수를 모릅니다. –

2

floatint & (int 참조)으로 해석하면 문이 활짝 열려 있기 때문에 값이 다릅니다. aint이 아니므로 실제로 그렇게 할 때 아무 것도 실제로 발생할 수 없습니다. 그런 일이 발생하면 float처럼 이 나타나지만 1065353216이됩니다. 기본 시스템 아키텍처에 따라 42 또는 핑크 투투 또는 충돌로 인한 코끼리가 될 수 있습니다. 이 float에서 int로 변환하는 방법을 이해하는 int에 캐스팅과 동일하지 않습니다

참고. int &으로 전송하면 원래 의미가 무엇인지 이해하지 않고 메모리의 비트를 보게됩니다.

+0

이것은 정의되지 않은 동작입니까, 아니면 단지 구현 정의입니까? –

+0

@OliCharlesworth 나는 그가 무슨 말을하는지 모른다. 그러나 표준은 분명히 그것이 정의되지 않은 행동이라고 말한다. (표준은 또한 구현이 기계 아키텍처에 익숙한 사람이 기대하는 것임을 분명히합니다. 일부 아키텍처에서는 특정 부동 소수점 값에 대한 충돌을 의미 할 수 있습니다. (아키텍처에 대해 들어 보지 못했습니다. 그러나 핑크 투투의 코끼리를 기대하고 있습니다.) –

+0

핑크톤 투투의 코끼리는있을 수는 없지만 표준에 의해 허용됩니다 ... –

9

이것은 정의되지 않은 동작을 의미합니다.

진지하게, 그것은 유형의 형태입니다. afloat이지만, a은 비트가있는 메모리 블록 (일반적으로 4 바이트)이기도합니다. (float&)a은 해당 메모리 블록을 마치 float 인 것처럼 처리합니다 (즉, 실제로 무엇인지). (int&)a은 이것을 int으로 취급하는 것을 의미합니다. 공식적으로 유형이 문자 유형이 아닌 경우 객체의 실제 유형이 아닌 유형의 lvalue 표현식을 통해 객체 (예 : a)에 액세스하는 것은 정의되지 않은 동작입니다. 실제로 두 가지 유형이 같은 크기 인 경우 결과는 비트 패턴의 재 해석으로 기대됩니다.

비트 패턴은 부호, 지수 및 가수를위한 비트를 포함한다. 일반적으로 지수는 일부 초과 -n 표기법을 사용하며 0.0 만 지수로 0을 갖습니다. (PC에서 사용되는 표현을 포함하여 일부 표현은 기본 2의 정규화 된 형식에서 항상 1이어야하므로 가수의 상위 비트를 저장하지 않습니다.이 경우 1.0의 저장된 가수는 모든 비트를 갖습니다 0) 또한 전형적으로 (그리고 나는 여기에 어떤 예외도 알지 못한다.) 지수는 상위 비트에 저장 될 것이다. 결과는 부동 소수점 값을 같은 크기의 정수에 "pun"입력하면 부동 소수점 값에 관계없이 값이 상당히 커집니다.

+0

하지만 reinterpret_cast의 약자이지만, 따라서, 구현 정의는 무엇입니까? 아니면 잘못된 것입니까? –

+1

@VJovic이 경우 reinterpret_cast입니다. 변환 자체는 다소 잘 정의되어 있습니다 (정렬 제약 조건을 위반하지 않는다는 가정하에). 변환은 공식적으로 정의되지 않은 동작입니다 (하지만 기본 아키텍처에 익숙한 사람이 기대하는 바를 의도합니다). –

관련 문제