关于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 }
---恢复内容结束---
当有那么一天,你相信你可以做到的时候,那你就真的能够做到!
路在脚下