为什么0x3f就错0x3ffff就对了呢

P1144 最短路计数

@[呆呆的她啊](/user/226167) 有没有一种可能 0x3f 才60多
by zheng_zx @ 2023-11-29 14:11:29


没有代码片段,不清楚你是什么问题
by zyl1543130456 @ 2023-11-29 14:16:52


@[zheng_zx](/user/1121230) 啊 编译器输出不是吧
by 呆呆的她啊 @ 2023-11-29 14:24:11


@[呆呆的她啊](/user/226167) ?什么意思,就算`unsigned long long`在`memset`中也会爆炸,`memset`的第二个参数并不是赋值为这个参数。你应该是哪里搞错了 ```cpp #include<iostream> #include<string.h> using namespace std; unsigned long long a[114514]; int main(){ memset(a,0x3ffff,sizeof(a)); printf("%d",a[0]); return 0; } ```
by _8008008 @ 2023-11-29 14:24:27


@[呆呆的她啊](/user/226167) 我赋的就是 0x3f,A 了的啊
by BIG_CUTE_BUG @ 2023-11-29 14:24:56


@[呆呆的她啊](/user/226167) 不能任意赋值 memset函数是按照字节对内存块进行初始化,所以不能用它将int数组出初始化为0和-1之外的其他值(除非该值高字节和低字节相同)。 其实c的实际范围应该在0~255,因为memset函数只能取c的后八位给所输入范围的每个字节。也就是说无论c多大只有后八位二进制是有效的。 来自[文章](https://blog.csdn.net/weixin_44162361/article/details/115790452?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170122006516800180685206%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=170122006516800180685206&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-115790452-null-null.142^v96^pc_search_result_base2&utm_term=memset&spm=1018.2226.3001.4187)
by _8008008 @ 2023-11-29 14:28:07


@[BIG_CUTE_BUG](/user/398983) 用memset是对的 不好意思撒 但是用for就出错了 ```c #include<iostream> #include<vector> #include<queue> #include<cstring> using namespace std; int n,m; const int n1=2000005; int d[n1],vis[n1]; int ans[n1]; struct node{ int ne; }; vector<node>e[2000005]; queue<int>q; inline int read() { int s=0;int w=1; char ch=getchar(); while(ch>'9'||ch<'0') { if(ch=='-')w*=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { s=s*10+ch-'0'; ch=getchar(); } return s*w; } void spfa() { while(q.size()) { int u=q.front(); q.pop(); vis[u]=0; for(auto i:e[u]) { int v=i.ne; if(d[v]>d[u]+1) { d[v]=d[u]+1; ans[v]=ans[u]; if(!vis[v]){q.push(v);vis[v]=1;} } else if(d[v]==d[u]+1){ ans[v]+=ans[u]; ans[v]=ans[v]%100003; } } } return ; } int main() { cin>>n>>m; for(int i=1;i<=m;i++) { int u=read(); int v=read(); e[u].push_back((node){v}); e[v].push_back((node){u}); } // memset(d,0x3f,sizeof(d)); // memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++) { d[i]=0x3f; vis[i]=0; } ans[1]=1; d[1]=0; q.push(1); vis[1]=1; spfa(); for(int i=1;i<=n;i++)cout<<ans[i]<<endl; return 0; } ```
by 呆呆的她啊 @ 2023-11-29 14:31:32


@[_8008008](/user/803885) 是for循环会出错 但是for循环中改成0x3fffff就对了 why????
by 呆呆的她啊 @ 2023-11-29 14:32:09


@[呆呆的她啊](/user/226167) 同楼上,0x3f 实际的十进制值为 63,所以循环赋值赋进去的只有 63。而 memset 按字节赋值,是每个字节赋上 0x3f,也就是对每个变量的每个字节刚好赋满,是个极大值。
by BIG_CUTE_BUG @ 2023-11-29 14:37:19


@[呆呆的她啊](/user/226167) 你说有没有一种可能,0x3f=63
by ScatteredHope @ 2023-11-29 14:39:41


| 下一页