2016-05-12 9 views
2
#include<iostream> 
using namespace std; 
union swap_byte {    //This code is for union 
public: 
    void swap(); 
    void show_byte(); 
    void set_byte(unsigned short x); 
    unsigned char c[2]; 
    unsigned short s; 
}; 

void swap_byte::swap()   //swaping the declared char c[2] 
{ 
    unsigned char t; 
    t = c[1]; 
    c[1] = c[0]; 
    c[0] = t; 
} 
void swap_byte::show_byte() 
{ 
    cout << s << "\n"; 
} 
void swap_byte::set_byte(unsigned short x)  //input for the byte 
{ 
    s = x; 
} 
int main() 
{ 
    swap_byte b; 
    b.set_byte(49034); 
    b.show_byte(); 
    b.swap(); 
    b.show_byte(); 
    cin.get(); 
    return 0; 
} 

私は組合の目的を理解することができず、上記のコードで組合の実装を見ましたが、コードが何をしているのか、どのように組合が働いているのかを説明してください。このコード行でどのように労働組合がどのように機能し、数字がスワップされているか説明できますか?

+0

本質的にショートを変換するエンディアンです。 c [0]とsのアドレスを調べると、メモリ内の同じ場所を指していることがわかります。作者はこれを次のように言っています:s =((s >> 8)&0x0F)| ((s << 8)&0xF0)。 – Aumnayan

答えて

6

unionは、メンバーが重なっている構造体の特別な種類ですので、swap_byteのレイアウトのようなものです:

|  |  | char c[2] 
------------- 
|   | short s 

しかし、これは同じ2メモリバイトで発生します。そのため、cの1バイトをスワップすると、shortの最も関連性が高く関連性の低いバイトをスワップする効果があります。

これは壊れやすく、複数の面を確認する必要があるため、これを実行する最善の方法ではないことに注意してください。さらに、デフォルトでは、最後の1つのセットと異なるユニオンフィールドにアクセスすると、C++では未定義の動作が発生します(Cでは許可されています)。これはめったに必要とされない古い技です。

関連する問題