2010-07-09 4 views
0

float가 int로 형변환되면이 주조가 컴파일러에서 어떻게 구현되는지. 컴파일러는 float 변수의 메모리 일부를 마스크합니다. 즉, 나머지 변수를 int 변수로 전달하기 위해 컴파일러에서 메모리의 어느 부분을 plunk 했습니까?float에서 int로 캐스트 할 때와 같이 컴파일러에서 캐스팅/변환을 수행하는 방법을 이해하려고 시도합니다.

이 질문에 대한 답변은 int와 float가 메모리에서 유지되는 방식에 있습니다.

하지만 컴파일러에 의존하지 않고 컴퓨터에 종속되지는 않습니다. 컴파일러가 낮은 유형으로 캐스팅 될 때 복사 할 메모리 부분을 결정하는 방법 (정적 캐스팅, 오른쪽).

저는 잘못된 정보와 혼동스러워합니다.

(내가 캐스팅인지 변환인지에 대한 토론이 진행되는 태그에 관한 몇 가지 질문을 읽었습니다. 컴파일러에 의해 수행 되었기 때문에이 부분에 대해별로 관심이 없습니다. 이것이 어떻게 수행되고 있는지).

... 감사

+0

어떤 프로그래밍 언어를 언급하고 있습니까? – adamk

+0

당신은 C++을 취할 수 있지만, c 또는 C++이든 상관없이 어떤 diff를 만드는지 않습니다. (u가 c/C++ 이외의 다른 언어를 의미하지 않았다면) – saurabh

답변

0

기본 유형이 아닌 포인터에 대해서 이야기하고 변환이 이루어집니다. 부동 소수점 표현과 정수 표현은 매우 다르기 때문에 (보통 IEEE-754와 각각의 2의 보수) 일부 비트를 마스킹하는 것 이상입니다.

당신이 변환을 수행하지 않고 int로서 표현 부동 소수점 숫자를보고 싶어하는 경우 (C에서) 같은 것을 수행 할 수 있습니다

float f = 10.5; 
int i2 = (int*)&f; 
printf("%f %d\n", f, i2); 
+0

'* (int *) & f' 표현식은 C의 포인터 별명 지정 규칙을 위반하므로 정의되지 않은 결과를 갖습니다. 최근 버전의 gcc에서는 종종 제대로 작동하지 않습니다. 앨리어싱 및 올바른 방법 (셀 지향 사이트에 있지만 내용은 주로 Cell에만 국한되지 않음)에 대한 올바른 설명은이 기사를 참조하십시오. http://cellperformance.beyond3d.com/articles/ 2006/06/understanding-strict-aliasing.html –

+0

좋은 지적. C/C++에서 유니온을 사용하면 어쩌면 비트 재 해석을위한 올바른 대답 일 것입니다. 어쨌든 그렇게하는 것은 쓸데없는 일입니다. 그래서 희망하는 질문은 단지 학문적 인 것입니다! 그러나 원래의 질문에 대해 int와 float에 대해 이야기 할 때 실제로 일어나는 전환 (비트 패턴 변경)입니다. –

+0

네, 질문 자체에 명시된 바와 같이 이해 목적으로 만 사용됩니다. 어쨌든 당신의 대답이 도움이되었습니다. 감사 – saurabh

0

대부분의 CPU 아키텍처는 기본 교육을 제공 (또는 멀티를 -instruction sequence)를 수행하여 float < -> int 변환을 수행하십시오. 컴파일러는 일반적으로이 명령어를 생성합니다. 종종 더 빠른 방법이 있습니다. 이 질문에는 좋은 정보가 있습니다 : What is the fastest way to convert float to int on x86.

관련 문제