노조가 무엇인지 잘 모르는 것 같습니다. 공용체의 멤버는 값이 겹칩니다. 즉, Count
노조 의 세 멤버는 동일한 공간을 공유합니다.
단지 데모를 위해, 가정은 short
는 float
32 비트 (4 바이트), 16 비트 (2 바이트) 및 double
64 비트 (8 바이트), 그 조합은 8 바이트이다 크기. 리틀 엔디안 형식에서는 num
구성원이 처음 2 바이트를 참조하고, weight
구성원은 처음 4 바이트 (num
의 2 바이트 포함)를 참조하며 볼륨 구성원은 전체 8 바이트를 나타냅니다 (num
의 2 바이트 포함). weight
의 네 바이트).
는 처음에는 노동 조합이 쓰레기를 포함, 알 수없는 비트 패턴, 즉의이 (16 진수로)이처럼 표시 할 수 :
GG GG GG GG GG GG GG GG // GG stands for garbage, i.e. unknown bit patterns
당신이 num
에 2를 설정하면, 처음 두 바이트, 0x02
0x00
있습니다 그러나 다른 바이트는 여전히 쓰레기입니다 : 당신이 weight
을 읽는다면, 당신은 단순히 float
으로 해석 처음 4 바이트를 읽기 때문에된다
02 00 GG GG GG GG GG GG
438,당신이 무엇을 그 바이트를 예측할 수는 소수점 값이 short
같은 필수 유형과 같은 완전히 다른 형식이 부동 때문에 바이트
02 00 GG GG
을 포함 (즉, 그 특정 비트 패턴)이 나타납니다. 그들은 부동 소수점 값 2.0f를 나타내지 않으므로 아마도 원하는 것입니다. 그것은 NaN
, +infinity
, -infinity
포함, 거의 모든 것을 할 수 있도록 실제로하는 float
의 "더 중요한"부분은 마찬가지로 등, weight
의 "쓰레기"일부 즉, 상위 바이트
를 저장 당신이 volume
를 읽는다면, 당신은 바이트
02 00 GG GG GG GG GG GG
로 구성 double
을하고 반드시 2를 나타내지 않습니다.0 일 수도 있지만 우연히 올바른 비트가 올바른 위치에 설정되고 그러한 값을 표시 할 때 작은 비트가 반올림되는 경우 우연히 매우 가까이에 올 수 있습니다.
유니온은 int
에서 float
또는 double
으로의 변환을 의미하지 않습니다. 그것들은 같은 종류의 다른 값을 저장할 수있는 것일 뿐이며, 에서 또 다른 멤버를 읽는 것은 단순히 유니온에 완전히 다른 것으로 표시된 비트 수를 다시 해석한다는 것을 의미합니다. 당신은 이 아니며을 변환합니다.
어떻게 변환하나요? 그것은 매우 간단하고 노동 조합이 필요하지 않습니다 당신이 (즉,이를 통해 할당 된 이외의 멤버), 결과는 의미에 따라 달라집니다 "잘못된"회원을 통해 노조에 액세스하는 경우
short num = 2;
float weight = num; // the compiler inserts code that performs a conversion to float
double volume = num; // the compiler inserts code that performs a conversion to double
정의되지 않은 동작을 정의하지 마십시오. – chris
당신은 그 노동 조합의'short' 부분만을 어떤 값으로 설정합니다. 나머지는 각 재실행시 임의의 데이터를 포함합니다. – usr2564301
그러면 소년은 무엇을해야할까요? 그냥 공기 중 당신 사과의 무게를 선택하십시오 –