You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何memset处理二维long long数组时,不同值存储结果不一致?

问题:memset初始化long long数组时不同值结果差异的原因

定义了二维long long数组:

long long arr[500][500];

运行以下main函数时,当m取-1和-3会得到不同结果:

int main(){
    memset(arr,m,sizeof(arr));
    for(int i=0;i<10;i++)
        cout<<arr[i][i]<<'\n';
    return 0;
}

当m=-3时,程序重复输出20次-144680345676153347;而m=-1时,输出结果为预期的-1。请问造成该差异的原因是什么?

附完整测试代码:

#include<iostream>
#include<cstring>
using namespace std;
using ll=long long;

ll dp[501][501];

int main(){
    //ios_base::sync_with_stdio(0);
    //cin.tie(0);
    //int n;
    //cin>>n;
    memset(dp,-3,sizeof(dp));
    for (int i = 0; i < 20; i++) {
        cout<<dp[i][i]<<'\n';
    }
    return 0;
}

原因解析

核心问题出在**memset的工作机制**上:

  • memset是按字节为单位初始化内存的,它会把第二个参数的低8位值,填充到目标内存的每一个字节中。
  • long long在绝大多数系统中是8字节大小,所以每个long long元素会被填充8个相同的字节值。

当m=-1时:

  • -1的二进制补码是全1(无论多少位宽度),它的低8位是0xFF。
  • 用0xFF填充8个字节后,得到的64位值是0xFFFFFFFFFFFFFFFF,对应十进制就是-1,和预期一致。

当m=-3时:

  • -3的8位二进制补码是0xFD(3的8位二进制为0x03,取反加1后得到0xFD)。
  • 用0xFD填充8个字节后,得到的64位值是0xFDFDFDFDFDFDFDFD。
  • 将这个64位补码转换为十进制,结果就是-144680345676153347,也就是你看到的输出。

总结:memset仅适合初始化非单字节类型数组为所有字节值相同的数值(比如-1、0),如果要给long long数组设置特定值,建议用循环逐个赋值,或者使用std::fill这类更适配的函数。

内容的提问来源于stack exchange,提问作者underdog

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 21:30:07