ええと、言語標準に反していると仮定して、C99仕様を間違えるべきではないと思います。
この規格では、変換の結果が異なるマシン/アーキテクチャ間で移植できない可能性があるとのみ述べられています。
特定のアーキテクチャで動作するようにプログラムをコーディングしている限り、問題はありません。
たとえば、オブジェクト(つまり、キー)を一意に識別するデータ構造DataStr_tの選択的なメンバーをグループ化し、別の構造体、たとえばDataStrKey_tにパックします。sizeof(DataStrKey_t)がsizeof(uint64)と等しいことを確認し、すべての実用的な目的で、扱いやすいのでuint64として使用します。
また、以下の操作も頻繁に行います。
memcmp(&var_uint64, &var_DataStructKey, sizeof(uint64));
マシンのキーを使用してオブジェクトの読み取りアクセスまたは書き込みアクセスを行う場合、変換の結果の値は予測可能であり、ビット単位の配置で一貫しています。「このデータのみ」を別のマシン(実際にはデータを書き込まなかった)に移動して読み取ろうとすると、問題が発生する可能性があります。
説明を増やしてコンパイルを成功させるために、プログラムを少し変更しました。ここでは、LINE_AとLINE_Bが同じマシンで実行されている限り、結果は常に予測可能です。ただし、(var_uint64、var_DataStructKey)をファイルに書き込んで別のマシンから読み取った場合、それらの入力された値に対してLINE_Bを実行すると、比較が失敗する可能性があります。
#include <stdio.h>
#include <string.h>
typedef unsigned long U32;
typedef struct hello_s
{
U32 a:8;
U32 b:24;
}hello_t;
int main()
{
hello_t str;
U32 var;
str.a = 0xAA;
str.b = 0xAAA;
var = *(U32 *)(&str); //LINE_A
if(0 == memcmp(&var, &str, sizeof(U32))) //LINE_B
printf("var : %lu\n", var);
return 0;
}
私の答えは遅すぎると思いますが、説明しようとしました。