2013-03-17 1 views
3

나는 두 번 나타내는 바이트 배열이 있습니다캐스트의 char *은 두 배로 - 바이트

char number[8]; 

을 내가 (8 바이트뿐만 아니라이있는) 실제 더블이 캐스팅해야합니다. 충고에 따라 시도했지만 실패했습니다 :

std::cout<<(*((*double)number))<<" is my number.\n"; 

왜 실패 했습니까? 물론 << 마술을 사용하여 데이터를 추출 할 수는 있지만 이렇게하고 싶지는 않습니다. 메모리를 소비하고 코드를 강건하게 만듭니다.

+0

이와 같은 타입 - 펀닝은 다소 위험합니다. (적어도 'char' IIRC의 특정 경우에는 유효하지만, 적어도 현재는 하나의 타입 만 사용하는 한 유효합니다). 일반적으로 '노동 조합'은 안전하고 편리합니다. 포인터를 사용하면 엄격한 앨리어싱이 항상 제공됩니다. – delnan

+0

@delnan하지만, 마지막으로 설정되지 않은 공용체 멤버에서 읽는 것은 UB입니다. 구현 정의 된대로 (적어도 캐스팅은 IIRC 임). – chris

+0

@chris 당신은 구현 정의보다 나은 것을 얻지 못할 것이고 표준은'char'에 얼마나 많은 비트가 있는지를 지정하지 않습니다. 그러나 구현 정의는 정의되지 않은 동작 ('* (int *) & a_double' IIRC와 같은 것들로 얻는 것)보다 훨씬 낫다. 더 중요한 것은, 둘 다 표준에 의해 동등하게 깨지더라도, 많은 컴파일러는 타입 기반 별칭 분석을 수행하여 포인터로 타입 펀칭을하는 코드를 깨뜨릴 수 있지만, 유니버스 IIUC를 통해 유형 펀치를 깨지는 않는다는 것입니다. – delnan

답변

8

왜 실패 했을까?

여기에 오타가 있습니다.

std::cout<<(*((double*)number))<<" is my number.\n"; 

과 어떻게해야합니까 :

std::cout<<(*((*double)number))<<" is my number.\n"; 

이되어야 하는가?

사용 된 괄호 수를 줄입니다.

std::cout<< *(double*)number <<" is my number.\n"; 

당신 해야 대신 C 캐스트의 캐스트, 그래서 당신이 무슨 일을하는지 분명 ++ 사용 C.

std::cout<< *reinterpret_cast<double*>(number) <<" is my number.\n"; 
+0

내 오타가 하루를 죽일 것입니다. 고맙습니다. –

+0

+1'(double *) number '대신'reinterpret_cast (number)'를 사용하는 것이 좋습니다. – LihO

+0

내 C + + 답변을 훔쳐 줘서 고마워. – poitroae

3

C++을 사용하는 경우 reinterpret_cast을 사용하십시오. C++은 훨씬 표현력이 풍부합니다.

// cool c++ 
double value = *reinterpret_cast<double*>(number); 

// c style 
double value = (*((double*)number)); 
+2

"왜 실패 했나요?" –

+0

원래 변수의 유형을 변경할 수 있습니까? –

+0

@OmriBarel : 네, 맞습니다. – LihO

1
char number[8]; 
double d; 
// number is assumed to be filled with a buffer representing a double. 
memcpy(&d, &number, sizeof(double)); 
std::cout << d; 

sizeof의이 필요한 경우 확실하지. 더블이 8 바이트라는 가정이 이루어 졌을 때 이미 피해가있었습니다. 나는 그것이 복식에 관한 표준에서 말하는 것을 모른다.

+1

표준은 사용 된 정확한 문구가 무엇인지 확실하지 않지만 double이 대부분 'float'값을 유지하기에 충분히 크다고 말합니다. – Cubic