2012-10-28 1 views
1

I 다음 타입 정의를 가지고C++ : union -> 구조체, 설명?

typedef union{ 
unsigned int Entry; 
struct { 
    unsigned char EntryType; 
    unsigned char EntryOffset[3]; 
}; 
} TLineDescriptor; 

I과 같은 형태의 다음 사용을 가지고

TLineDescriptor LineDescriptor; 
LineDescriptor.Entry = 40; 
LineDescriptor.EntryType = 0x81; 

sizeof(LineDescriptor)이 변수가 처음 나는 것으로 메모리의 4 바이트를 차지하는 것을 보여준다 그것은 int 또는 struct 중 하나를 보유합니다.

cout << LineDescriptor.Entry << " " << LineDescriptor.EntryType << endl; 

그러나 인쇄 개의 상이한 값, 즉 129 ü, LineDescriptor.Entry 상기 광고 명백하게를 0x81 값이 저장된 메모리 위치를 참조한다. 나는 40과 무슨 일이 일어 났는지는 잘 모르겠다. 그러나 내 가정이 틀렸다는 것은 분명하다. 누군가 해석하고 유형 정의를 적절하게 설명 할 수 있습니까? 내가 찾은 코드로 작업하는 것이 중요합니다.

미리 감사드립니다. 이 방법으로

답변

1

이들은 실제로 다른 값이 아닙니다. 129ü 문자의 문자 코드입니다. 은 intchar 데이터 형식을 다르게 처리하여 첫 번째 숫자 값과 후자 문자 값을 인쇄합니다.

따라서 공용체 유형에 대한 이해가 정확합니다. 그러나 엔디 언 형식은 유니온 타입을 다룰 때 문제가 될 수 있습니다. 예를 들어, 리틀 엔디안 컴퓨터에서는 이 Entry의 최하위 바이트와 EntryOffset 배열을 보유합니다. 그러나 빅 엔디안 시스템에서는 EntryType이 최상위 바이트를 보유합니다.

1

인쇄 입력 유형 :

cout << "0x" << hex << (unsigned)LineDescriptor.EntryType << endl; 

및 그 유를 0x81입니다 볼 수 있습니다. 이 인쇄

: - 노동 조합에 하나의 요소가 순간에 "활성"이 될 수 있기 때문에 -

cout << LineDescriptor.Entry 

은 정의되지 않은 동작과 마지막 과제는 입력 유형이었다. 우리는 다음이 C가 될하고자 ++로 실제로 정의되지 않은 아니라고 129을 가정 할 수있다 가정 그러나

이며,에서 :

Entry=40 - 시스템 28 00 00 00 (첫번째 덜 중요한 바이트)에 바이너리 형식으로되어 . LineDescriptor.EntryType = 0x81;

당신은 첫 번째 바이트 변경 : 81 00 00 00를 - 그래서 입력에 대한 출력은 129

이 실험을 확인하고 다른 결과를 얻을 지금 :

TLineDescriptor LineDescriptor을;

LineDescriptor.Entry = 256; 
LineDescriptor.EntryType = 0x81; 

cout << LineDescriptor.Entry << " " << unsigned(LineDescriptor.EntryType) 
    << endl; 
>> 385 129 
+0

실험 해 주셔서 감사 드리며 내부 동작을 훨씬 명확하게 보여줍니다. –

1

귀하의 가정이 잘못되어 있지 않은 경우, 조합은 int 또는 struct 중 하나를 보유합니다.EntryType 필드에 0x81 값을 할당하면 이전에 Entry에 할당 된 정수를 덮어 씁니다. 따라서 cout 두 필드를 모두 사용하면 정수 (int) (129)와 같은 값을 얻을 수 있습니다. a char (ü). 둘 다 16 진수 값 0x81입니다.

1

intstruct동일 시간에 있고, 두 메모리가 동일한 메모리 공간을 차지합니다. TLineDescriptor::Entry에 액세스하면 해당 4 바이트를 int으로 해석합니다. struct을 통해 액세스하는 경우이를 4 unsigned char로 해석합니다.

LineDescriptor.Entry = 40; 

이 작은 엔디안의 시스템에서는 40의 int 값 4 바이트 세트 이것은 첫 번째 바이트가 40 인 것을 의미하고, 다른 3 바이트가 0

LineDescriptor.EntryType = 0x81; 

은이 첫번째 바이트를 설정 129 (0x81) 값으로. (소형 엔디안 시스템에서 이것은 나머지가 0으로 설정 되었다면 Entry의 값이 129 임).

다른 출력에 대해 : 항목 유형을 출력 할 때 숫자 대신 문자로 표시됩니다. 시도해보십시오.

cout << LineDescriptor.Entry << " " << static_cast<int>(LineDescriptor.EntryType) << endl;