1

重複の可能性:
int のすべてのバイトを (unsigned char)0 に設定すると、ゼロを表すことが保証されますか?

構造体内に次の匿名共用体があります。

union
{
    unsigned value;
    char name[4];
};

次のコードを置き換えることはできますか:

name[0] = 0;
name[1] = 0;
name[2] = 0;
name[3] = 0;

次のコードで?

value = 0;
4

6 に答える 6

2

あなたの単純なケースでは同じですが、(おそらく)int(およびunsignedの略unsigned int)が32ビット(つまり4バイト)であるためです。配列がそれよりも大きい場合、またはint16 ビットしかない場合は、同じではありません。

于 2012-07-13T11:26:26.847 に答える
1

このコードの方が優れていると思います:

memset(name, 0, max(sizeof(name), sizeof(int)));
于 2012-07-13T11:25:57.220 に答える
1

Cでは、あなたがしたほうがいいです

union
{
   char name[sizeof(unsigned)];
   unsigned value;
};

たとえば、周囲の を初期化する場合、暗黙的なイニシャライザは、struct常に name フィールドを all に初期化します0。また、提供されunsignedたパディング ビットはありません (非常に可能性が高い) への初期化または割り当ても、常にゼロ0になります。valuename

C++ のルールは異なります。あなたが書き込んだ別のフィールドからの読み取りは UB のようです。

于 2012-07-13T13:07:29.600 に答える
0

の間に

name[0] = 0;

name[1] = 0;

name[2] = 0;

name[3] = 0;

他の関数は他のバイトを変更できます。そう、

value = 0; 

より安全だと思います

于 2012-07-13T11:23:30.997 に答える
0

はいsizeof(unsigned)==4

于 2012-07-13T11:26:33.307 に答える
-1

はい、64 ビット マシンを使用している場合はそうです。そうでない場合は、名前の最初の 2 文字を上書きします。これは、32 ビット マシンunsignedでは のサイズが 4 (またはそれ以上) ではなく 2 バイトであるためです。

于 2012-07-13T18:34:33.950 に答える