C++에서는 유니온을 사용하지만 넣을 때 다른 것을 꺼내는 것은 정의되지 않은 동작입니다. 은 아마도이지만 Delphi에서 사용되는 컴파일러 타겟에 따라 동일한 플랫폼, 즉 Win32 또는 Win64와 동일한 ABI으로만 작동합니다. 그래서 델파이
:
type
LongRec = packed record
case Integer of
0: (Lo, Hi: Word);
1: (Words: array [0..1] of Word);
2: (Bytes: array [0..3] of Byte);
end;
그리고 "문자"C++ 번역 :
#pragma pack(push, 1)
union LongRec
{
struct { unsigned short Lo, Hi; };
struct { unsigned short Words[2]; };
struct { unsigned char Bytes[4]; };
}
#pragma pack(pop)
합니다 (위의 가정 sizeof(short) == 2
즉, 변수는 리틀 엔디안과 구조체가 완전히 겹쳐 있다는 것을, 모두가 모든 플랫폼에서 해당되지 않을 수 있습니다.)
다시 말해서, 차 long
의 가장 높은 바이트로입니다
byte2 = reinterpret_cast<LongRec *>(&myLongint)->Bytes[2];
같은 것을 할 정의되지 않은 동작(비록 그 것이다 델파이와 같은 Windows 플랫폼에서 아마 일). 적절한 행동이
(느리지 만 정확한) :
byte2 = myLongint >> 16 & 0xFF;
또는
myHiWord = myLongint >> 16 & 0xFFFF;
그러나 심지어는 바이트 항상 사실이 아닌 옥텟이라고 가정
. 즉, 이것은 휴대용이 아니며
은 Windows 32 및 64 비트에서과 동일하게 작동합니다.
기본적으로 'int32'를 'int8 [4]'로 타입 변환하고 요소를 읽습니다. –