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 位(即四个字节)。如果数组更大,或者int只有 16 位,则不会相同。

于 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没有填充位(这很可能)初始化或分配0tovalue也将始终归零name

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 位机器,那就对了。如果不是,您将覆盖 name 的前 2 个字符,因为在 32 位机器上unsigned的大小是 2 字节而不是 4(或更高)。

于 2012-07-13T18:34:33.950 回答