关于memset

---恢复内容开始---

memset是刷内存用的,一次刷一个字节。

所以memset(a,1,sizeof(a))并不是使a=1,若a为字符类型则a的确等于1因为字符类型就是一个字节,

然而int类型呢,4个字节,等价于这样00000001000000010000000100000001

所以只能memset(xxx,0,sizeof(xxx)); memset(xxx,-1,sizeof(xxx)); 这代表0和-1(有符号)

但是问题还是有,在于-1,无符号整数怎么办,于是就变成了极大值,比如unsigned int memset-1等价于 2^32-1,但是会用到无符号类型吗。

其实会的,在bool类型,它在内存中一个字节,会被强制转换成unsigned char,所以memset-1 等价于255

但是赋值bool 为-1 却依旧把它当做00000001赋值进去(这是我猜测的,没空去查资料了)

而memset-1 是刷了11111111进去,这时同样做逻辑非运算,我猜测逻辑非会根据数据类型进行计算,所以普通情况下int非0为1,我猜测bool类型只看最后一位,但是cout输出的时候就转换成unsigned char。

目前觉得还是有些乱,日后到大学再说吧。保险期间,不要乱刷memset,风险很大,不过以下几种还是没问题的:

memset 0

memset int类 -1

memset int类 0x3f 大约10亿6千万

memset int类 0x7f max_int

其实手写for循环也无不可,虽然不顺眼,但是保险啊。

测试代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <string>
 5 #include <algorithm>
 6 #include <queue>
 7 #include <vector> 
 8 using namespace std;
 9 int main(){
10     unsigned int a[10];
11     memset(a,-1,sizeof(a));
12     cout<<a[0]<<endl;
13     bool x=true;
14     cout<<x<<endl;
15     cout<<!x<<endl;
16     bool y=-1;
17     cout<<y<<endl;
18     cout<<!y<<endl;
19     bool z[10];
20     memset(z,-1,sizeof(z));
21     cout<<z[0]<<endl;
22     cout<<!z[0]<<endl;
23     cout<<(z[0]==-1)<<endl;
24     cout<<(!z[0]==0)<<endl;
25     int p=10;
26     cout<<!p<<endl;
27     int q[10];
28     memset(q,10,sizeof(q));
29     cout<<!q[0]<<endl;
30     return 0;
31 }

 

---恢复内容结束---

posted @ 2015-09-25 13:46  JimmyLin^_^  阅读(1135)  评论(0编辑  收藏  举报