2014-02-21 1 views
0

여기서 노조는 노조를 조롱하고 첫 번째 구성원 인 "int age"를 초기화하려고했습니다. 내 지식에 따라 ANSI C 컴파일러가이를 지원합니다. 내 질문은 왜 "512,0,2"같은 출력을 얻는 것입니다. 512를 513, 514, 768로 바꾸면 다음과 같은 결과가 나옵니다. "513,1,2", "514,2,2", "768,0,3", 이제 e1.name [0]이 % 256 및 e1을 저장하고있는 것을 볼 수 있습니다. .name [1]은 (256)/256을 저장 중입니다. 왜 이런 일이 발생하는지 설명하면 크게 감사하겠습니다. 감사합니다.노조가 c로 초기화됩니다.

+0

http://stackoverflow.com/questions/346536/difference-between-a-structure-and-a-union-in-c – zakinster

답변

2

이것은 정의되지 않은 동작이므로 공용 영역에 필드를 저장하고 다른 형식으로 검색 할 수 없습니다. 따라서 표준에 관한 한 모든 것이 수용 가능하기 때문에이 코드의 출력을 실제로 "기대할"수는 없습니다. (512)을 0x200 때문에, 이것은 당신의 아키텍처는 리틀 엔디안는 것을 의미, 512은 2^9이기 때문에 가정 정수는 32 비트입니다, 그것과는 별도로 A question about union in C

와 문자는 8 비트입니다 :

이 질문을 참조하십시오. e1.name[0]e2.name[1]에 액세스하면 메모리에 저장된 512 바이트의 처음 2 바이트에 액세스하는 것입니다. 메모리에 저장된 것은 0x00 (최하위 바이트)이고 0x2 (최하위 바이트 다음 바이트)입니다.

0

다음과 같이 상상해보십시오 : 공용체는 두 개의 문자 또는 하나의 int를 가질 수 있습니다. 공용체에 int를 저장하면 두 char 부분도 읽을 수 있지만 저장된 int의 이진 부분을 포함하게됩니다. 예제에서 name [0]은 원래 저장된 int의 하위 16 비트를 포함하고 name [1]은 원래 int의 상위 16 비트를 포함합니다.

1

그건 노조가해야 할 일입니다. 동일한 데이터를 다른 데이터 유형으로 저장합니다. 당신의 가치를 들어

513 = 0x0201 
514 = 0x0202 
768 = 0x0300 

name[0]

는 최하위 바이트를 저장하고 및 name[1] 가장 중요한 바이트를 저장한다. 다른 아키텍처를 사용하는 경우에는 되돌릴 수 있습니다.

+0

내 질문에 대해 설명해 주셔서 감사합니다. 귀하의 대답은 짧지 만 분명합니다. 이제 그 점을 이해합니다. –