为何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
相关产品推荐
相关产品推荐

