C语言//////////////

#include<stdio.h>#include<string.h>intmain(){inta[4][5];memset(a,100,sizeof(a));for(i... #include<stdio.h>
#include<string.h>
int main()
{
int a[4][5];
memset(a,100,sizeof(a));
for(int i=0;i<4;i++)for(int j=0;j<5;j++)printf("%d\n",a[i][j]);
}
为什么输出这个?
1684300900
1684300900
1684300900
1684300900
1684300900
1684300900
1684300900
1684300900
1684300900
1684300900
1684300900
1684300900
1684300900
1684300900
1684300900
1684300900
1684300900
1684300900
1684300900
1684300900
展开
 我来答
沧海雄风2009
2018-03-16 · TA获得超过1.1万个赞
知道大有可为答主
回答量:8525
采纳率:79%
帮助的人:2828万
展开全部
第一:memset函数按字节对内存块进行初始化,所以不能用它将int数组初始化为0和-1之外的其他值(除非该值高字节和低字节相同)。
第二:memset(void *s, int ch,size_tn);中key实际范围应该在0~~255,因为该函数只能取ch的后八位赋值给你所输入的范围的每个字节,比如int a[5]赋值memset(a,-1,sizeof(int )*5)与memset(a,511,sizeof(int )*5) 所赋值的结果是一样的都为-1;因为-1的二进制码为(11111111 11111111 11111111 11111111)而511的二进制码为(00000000 00000000 00000001 11111111)后八位都为(11111111),所以数组中每个字节,如a[0]含四个字节都被赋值为(11111111),其结果为a[0](11111111 11111111 11111111 11111111),及a[0]=-1,因此无论ch多大只有后八位二进制有效,而八位二进制[2] 的范围(0~255)YKQ改。而对字符数组操作时则取后八位赋值给字符数组,其八位值作为ASCII[3] 码。
所以这个4字节的100的后一个字节是 0110 0100
把一个int 4个字节的全初始化为0110 0100
那最后就是 0110 0100 0110 0100 0110 0100 0110 0100 4个字节32比特 转为十进制就是 1684300900
White_MouseYBZ
2018-03-16 · TA获得超过4万个赞
知道大有可为答主
回答量:2.1万
采纳率:82%
帮助的人:6585万
展开全部
没错啊!以a[0][0]为例:a是int型,所以有4个字节,memset把100放进了这4个字节,就是说每个字节是100。100的二进制是01100100,4个01100100就是01100100 01100100 01100100 01100100,这个数刚好是1684300900的补码。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
一变班爱麻啊堡0J
高粉答主

2020-01-13 · 醉心答题,欢迎关注
知道答主
回答量:11.4万
采纳率:2%
帮助的人:5678万
展开全部
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式