【问题标题】:After memset operation, the result of array is 0 [duplicate]memset操作后,数组的结果为0 [重复]
【发布时间】:2018-10-23 12:36:00
【问题描述】:
int main()
{
    int array[10];
    memset(array, INT_MIN, sizeof(array));
    cout << INT_MIN << endl;
    for (int i = 0; i < 10; i++)
        cout << array[i] << endl;
    system("pause");
}

就像那样,当我使用“memset(array, -1, sizeof(array))”时,我会得到正确的结果。但是,当我使用 INT_MIN 而不是 -1 时,所有输出均为 0,但 INT_MIN 应为 -2147483648: 输出: results image

【问题讨论】:

  • 请不要张贴文字图片。只需将文本作为文本发布。
  • 您可能希望为此使用 std::fill en.cppreference.com/w/cpp/algorithm/fill
  • 在现代 C++ 中使用 std::fill(您将避免这个问题和许多其他问题)。

标签: c++ memset


【解决方案1】:

指令:

memset(array, INT_MIN, sizeof(array));

按转换结果设置每个字节:(unsigned char)INT_MIN,因为它按字节操作,而不是数组元素。

【讨论】:

  • 完全正确。你会发现奇怪的是 INT_MIN 的 2 的补码表示是 1000 0000 0000 0000 0000 0000 0000 0000,所以当你转换为无符号字符时,你会得到 0000 0000。
【解决方案2】:

memset 的“问题”是它没有填写你给它的 int,而是 unsigned char 的转换。见here

要设置的值。该值作为 int 传递,但函数填充 使用此值的无符号字符转换的内存块。

因此,如果你给它INT_MIN 作为第二个参数,你最终会得到0。对于这个特定任务,恐怕memset 不是该工作的正确工具,因为它单独设置每个字节,因此不允许您随意设置 int,除非所需的模式由相同的字节一遍又一遍,这不是这里的情况。

【讨论】:

  • 澄清为什么memset不是正确的工具:它只能用于将所有字节设置为相同的值,因此只能导致所有字节相同的多字节数,这在四个字节的情况下,八位字节的数字都是 16843009 的倍数。由于符号表示是实现定义的,因此不能保证任何特定的负数都具有这种表示。它很少用于设置为 0 或 -1 以外的任何值,而后者仅用于无符号数,除非可以接受依赖 2 的补码。
  • 很好,我将它添加到答案中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-11
相关资源
最近更新 更多