나는 두 번 나타내는 바이트 배열이 있습니다캐스트의 char *은 두 배로 - 바이트
char number[8];
을 내가 (8 바이트뿐만 아니라이있는) 실제 더블이 캐스팅해야합니다. 충고에 따라 시도했지만 실패했습니다 :
std::cout<<(*((*double)number))<<" is my number.\n";
왜 실패 했습니까? 물론 <<
마술을 사용하여 데이터를 추출 할 수는 있지만 이렇게하고 싶지는 않습니다. 메모리를 소비하고 코드를 강건하게 만듭니다.
이와 같은 타입 - 펀닝은 다소 위험합니다. (적어도 'char' IIRC의 특정 경우에는 유효하지만, 적어도 현재는 하나의 타입 만 사용하는 한 유효합니다). 일반적으로 '노동 조합'은 안전하고 편리합니다. 포인터를 사용하면 엄격한 앨리어싱이 항상 제공됩니다. – delnan
@delnan하지만, 마지막으로 설정되지 않은 공용체 멤버에서 읽는 것은 UB입니다. 구현 정의 된대로 (적어도 캐스팅은 IIRC 임). – chris
@chris 당신은 구현 정의보다 나은 것을 얻지 못할 것이고 표준은'char'에 얼마나 많은 비트가 있는지를 지정하지 않습니다. 그러나 구현 정의는 정의되지 않은 동작 ('* (int *) & a_double' IIRC와 같은 것들로 얻는 것)보다 훨씬 낫다. 더 중요한 것은, 둘 다 표준에 의해 동등하게 깨지더라도, 많은 컴파일러는 타입 기반 별칭 분석을 수행하여 포인터로 타입 펀칭을하는 코드를 깨뜨릴 수 있지만, 유니버스 IIUC를 통해 유형 펀치를 깨지는 않는다는 것입니다. – delnan