以下のような構造体があるのですが、
ビッグエンディアン、リトルエンディアン関係なく、
ネットワークバイトオーダーへ変換できる(もしくは型定義できる)コードを書きたいと思っています。
[構造体]

struct sample {
  unsigned short a:12;
  unsigned short b:2;
  unsigned short c:2;
};

↓これで問題ないですか?

struct sample val = {300,1,2};
htons((uint16_t)val);

もしくは、以下のように定義すれば、htons()で変換しなくても大丈夫でしょうか?

struct sample {
#if __BYTE_ORDER == __LITTLE_ENDIAN
  unsigned short a1:8; /* aの前半 */
  unsigned short c:2;
  unsigned short b:2;
  unsigned short a2:4; /* aの後半 */
#endif
#if __BYTE_ORDER == __BIG_ENDIAN
  /* ビッグエンディアンならそのまま流してOK? */
  unsigned short a:12;
  unsigned short b:2;
  unsigned short c:2;
#endif
};

ビットフィールドが8以下で、バイトの区切りをまたがなければ