重複の可能性:
int のすべてのバイトを (unsigned char)0 に設定すると、ゼロを表すことが保証されますか?
構造体内に次の匿名共用体があります。
union
{
unsigned value;
char name[4];
};
次のコードを置き換えることはできますか:
name[0] = 0;
name[1] = 0;
name[2] = 0;
name[3] = 0;
次のコードで?
value = 0;
重複の可能性:
int のすべてのバイトを (unsigned char)0 に設定すると、ゼロを表すことが保証されますか?
構造体内に次の匿名共用体があります。
union
{
unsigned value;
char name[4];
};
次のコードを置き換えることはできますか:
name[0] = 0;
name[1] = 0;
name[2] = 0;
name[3] = 0;
次のコードで?
value = 0;
あなたの単純なケースでは同じですが、(おそらく)int
(およびunsigned
の略unsigned int
)が32ビット(つまり4バイト)であるためです。配列がそれよりも大きい場合、またはint
16 ビットしかない場合は、同じではありません。
このコードの方が優れていると思います:
memset(name, 0, max(sizeof(name), sizeof(int)));
Cでは、あなたがしたほうがいいです
union
{
char name[sizeof(unsigned)];
unsigned value;
};
たとえば、周囲の を初期化する場合、暗黙的なイニシャライザは、struct
常に name フィールドを all に初期化します0
。また、提供されunsigned
たパディング ビットはありません (非常に可能性が高い) への初期化または割り当ても、常にゼロ0
になります。value
name
C++ のルールは異なります。あなたが書き込んだ別のフィールドからの読み取りは UB のようです。
の間に
name[0] = 0;
と
name[1] = 0;
と
name[2] = 0;
と
name[3] = 0;
他の関数は他のバイトを変更できます。そう、
value = 0;
より安全だと思います
はいsizeof(unsigned)==4
。
はい、64 ビット マシンを使用している場合はそうです。そうでない場合は、名前の最初の 2 文字を上書きします。これは、32 ビット マシンunsigned
では のサイズが 4 (またはそれ以上) ではなく 2 バイトであるためです。