저는 IT 학생이며 오늘은 C 프로그래밍 시험을 보았습니다. 질문 중 하나는 다소 혼란 스럽습니다 : float *을 int *로 변환 할 수 있습니까? 나는 너의 의견을 뭐라고하지 않았어?두 개의 포인터 (float * ~ int *) 캐스팅
답변
당신은 수 있습니다. 캐스팅하지만 float의 정수 버전을 마술처럼 사용하지는 않습니다.
어쨌든 메모리에 어딘가에 플로트가 있고 동일한 위치에 정수 포인트가있는 것입니다. 그러나 두 표현은 다르게 표현됩니다 (예 : two's complement 대 IEEE 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)
까지 검사 할 수 있습니다.
'printf ("sizeof (int) = % lu \ n", sizeof (int))'는 잠재적으로 안전하지 않을 수 있습니다. 나는 표준이'size_t '에 대해 말하는 것을 모르지만,'long'이 8 바이트이고'size_t'가 플랫폼에서 4 바이트이면'printf'를 호출하는 것이 문제의 원인이다.아마도 더 안전하고 (더 이식성있는) 작성 방법이있을 것입니다. [this answer] (http://stackoverflow.com/a/587032/1382251)에 따르면' "% z"'를 사용해야합니다. –
고마워, 네 말이 맞아. http://stackoverflow.com/questions/3168275/printf-format-specifiers-for-uint32-t-and-size-t에서 추천 한'% lu'에서'% zu'로 변경했습니다 (' PRIu'하지만 실제로는 % z가 아닙니다. 팁을 주셔서 감사합니다!) – csl
당신을 진심으로 환영합니다. 방금 "print size_t in c"로 검색해 보았습니다. –
왜 그냥 사용해 보지 않으시겠습니까? 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
입니다.
편집 : 내게는 대답 :
그래, 대답은 거의 동일합니다. :-) – csl
그것은 단 하나의 답변이기 때문입니다! 단지 당신이 제일 먼저 신용을 얻고 싶었습니다. –
- 1. C++ int float 캐스팅
- 2. int float float float
- 3. 두 포인터 사이의 변환/캐스팅
- 4. 타입 캐스팅 오류 int 형변환에 대한 포인터
- 5. 포인터 타입 캐스팅
- 6. INT 포인터 C에서
- 7. F # 캐스팅 int
- 8. num이 C에서 float 일 때 (int *)로 캐스팅
- 9. 캐스팅 경고가없는 정수에서 포인터
- 10. 포인터/주소 유형 캐스팅
- 11. int에 대한 포인터 캐스팅
- 12. C++ 함수 포인터 캐스팅
- 13. 타입 캐스팅 방법 포인터
- 14. 안전하게 캐스팅 void * to int
- 15. 두 개의 포인터 관련 질문
- 16. 유형 캐스팅 int 및 double
- 17. thrust :: device_vector 캐스팅 방법 <int> 원시 포인터
- 18. 두 개의 다른 구조체에 대한 포인터
- 19. 타입 캐스팅 및 포인터
- 20. 두 개의 float 값에 대한 float 리마인더 계산 방법
- 21. 하나의 float 변수에 두 개의 float 값 저장
- 22. 캐스팅 오류가없는 정수에서 포인터
- 23. 다형성 : 런타임 캐스팅 포인터
- 24. 숫자가 정확한 float (int)인지 또는 실제 float 값인지 확인하십시오.
- 25. 안드로이드 SQLite 컬럼 int int float?
- 26. 포인터 캐스팅 경고 두 unsigned char * 값 사이
- 27. 는 두 개의 코드
- 28. 위치 div 두 개의 float div 뒤에
- 29. 캐스팅 열거 형 int int 비싼가요?
- 30. 클래스 및 포인터 용 C++ 유형 캐스팅
이길 @csl 당신은 당신이 할 수 있습니다 : static_cast를 확인하고 아니, C++의 – BeyelerStudios
@BeyelerStudios을 reinterpret_cast? –
"당신 의견은 뭐죠?" - 아무런 의견이 없어. 'float *'를'int *'에 캐스트하는 것이 가능합니다. 그것은 당신이 기대하는대로하지 못할 수도 있지만, 불가능하거나 불가능한 것은 아닙니다;) –