2015-01-08 3 views
3

저는 IT 학생이며 오늘은 C 프로그래밍 시험을 보았습니다. 질문 중 하나는 다소 혼란 스럽습니다 : float *을 int *로 변환 할 수 있습니까? 나는 너의 의견을 뭐라고하지 않았어?두 개의 포인터 (float * ~ int *) 캐스팅

+0

이길 @csl 당신은 당신이 할 수 있습니다 : static_cast를 확인하고 아니, C++의 – BeyelerStudios

+0

@BeyelerStudios을 reinterpret_cast? –

+3

"당신 의견은 뭐죠?" - 아무런 의견이 없어. 'float *'를'int *'에 캐스트하는 것이 가능합니다. 그것은 당신이 기대하는대로하지 못할 수도 있지만, 불가능하거나 불가능한 것은 아닙니다;) –

답변

4

당신은 수 있습니다. 캐스팅하지만 float의 정수 버전을 마술처럼 사용하지는 않습니다.

어쨌든 메모리에 어딘가에 플로트가 있고 동일한 위치에 정수 포인트가있는 것입니다. 그러나 두 표현은 다르게 표현됩니다 (예 : two's complementIEEE 754) 결과적으로 매우 다른 정수가 표시됩니다. 예를 들어

: 내 시스템에서

#include <stdio.h> 

int main() { 
    printf("sizeof(int) = %zu\n", sizeof(int)); 
    printf("sizeof(float) = %zu\n", sizeof(float)); 

    float m = 456.78f; 
    int *p = (int*)&m; 

    printf("Float: %f\n", m); 
    printf("Integer: %d\n", *p); 

    return 0; 
} 

이 출력 :

sizeof(int) = 4 
sizeof(float) = 4 
Float: 456.779999 
Integer: 1139041239 

가 나는 그들이 뿐만 아니라 다를 수 있음을 강조 할뿐만 아니라 그 크기를 인쇄 할 수 있습니다. 예를 들어 정수가 커지면 플로트 외부의 메모리를 터치합니다.

이것은 아마도 원하는 것이 아니지만 용도가 있습니다. 예를 들어, 특정 float에 대한 비트 표현을 보려면 uint8_t과 같은 것으로 캐스팅하고 sizeof(float)까지 검사 할 수 있습니다.

+1

'printf ("sizeof (int) = % lu \ n", sizeof (int))'는 잠재적으로 안전하지 않을 수 있습니다. 나는 표준이'size_t '에 대해 말하는 것을 모르지만,'long'이 8 바이트이고'size_t'가 플랫폼에서 4 바이트이면'printf'를 호출하는 것이 문제의 원인이다.아마도 더 안전하고 (더 이식성있는) 작성 방법이있을 것입니다. [this answer] (http://stackoverflow.com/a/587032/1382251)에 따르면' "% z"'를 사용해야합니다. –

+0

고마워, 네 말이 맞아. http://stackoverflow.com/questions/3168275/printf-format-specifiers-for-uint32-t-and-size-t에서 추천 한'% lu'에서'% zu'로 변경했습니다 (' PRIu'하지만 실제로는 % z가 아닙니다. 팁을 주셔서 감사합니다!) – csl

+0

당신을 진심으로 환영합니다. 방금 "print size_t in c"로 검색해 보았습니다. –

2

왜 그냥 사용해 보지 않으시겠습니까? float

$ cat foo.c 
#include <stdio.h> 
int main(){ 
    float f = 0.15625; 
    float *p = &f; 
    printf("%f\n", *p); 
    printf("%i\n", *((int *)p)); 
} 
$ gcc foo.c 
$ ./a.out 
0.156250 
1042284544 

는 32 비트이고 당신에 대해 읽을 수있는 방법의 표현 : http://en.wikipedia.org/wiki/Single-precision_floating-point_format

내가 가리키는있어 데이터가이다 "고 단지 C를 이야기하는 int 포인터에 float 포인터를 캐스팅 int ".

float 0.156250은 이진수 0111110001000000000000000000000으로 표현되며 정수는 1042284544입니다.

편집 : 내게는 대답 :

+0

그래, 대답은 거의 동일합니다. :-) – csl

+1

그것은 단 하나의 답변이기 때문입니다! 단지 당신이 제일 먼저 신용을 얻고 싶었습니다. –