https://blog.csdn.net/yang_zongjun/article/details/39025581
有很多博客的确介绍了怎么具体操作。
但是我有些不理解它实际的计算,所以自己写一篇博客,以后人为鉴:
贴上代测代码:
int a[100];
int main(){
cout<<"memset():\n"<<endl;
memset(a, -1, sizeof(a)); cout <<" -1: "<< setw(12)<<right<< a[1] << endl;
memset(a, 0, sizeof(a)); cout <<" 0: "<< setw(12)<<right<< a[1] << endl;
memset(a, 1, sizeof(a)); cout <<" 1: "<< setw(12)<<right<< a[1] << endl;
memset(a, 127, sizeof(a));cout <<"127: "<< setw(12)<<right<< a[1] << endl;
memset(a, 128, sizeof(a));cout <<"128: "<< setw(12)<<right<< a[1] << endl;
return 0;
}
效果图:
大家观察到了吗:有些数字比如:1 通过代码可以看出来不是 1 。而是16843009。
这个是为什么呢???
首先介绍一下:
int类型占4个字节(Byte) 而1位的字节里有8个位(二进制每一位)
转化为十进制时会先需要 按权相加,最后的还需要除以2,因为你最高位是符号位
上面就是计算机导论所谈到的编码
memset()的功能就是给我什么类型 对于每一个字节赋值,这个值就是二进制8位的数字;
对于int类型它进行的就是对于4个字节单独赋值。
例如 memset(a, 1, sizeof(a));
此时a[ ] 每一个元素里的值为(0000,0001 0000,0001 0000,0001 0000,0001)(2)=16843009(10)
如图所示:
而计算memset(a,128,sizeof(a ))
a[0]=(1000,0000 1000,0000 1000,0000 1000,0000)(2)
此时它的最高位(符号位)被占据了。
我们知道 :
符号位=0:这个数为正数:原码=反码=补码。计算补码也就相当于计算原码值
符号位=1:这个数为负数:反码符号位不变 其余每一位取反。补码在反码+1;
原码:1000,0000 1000,0000 1000,0000 1000,0000
反码:0111,1111 0111,1111 0111,1111 0111,1111
补码:1111,1111 0111,1111,0111,1111,1000,0000
计算是不涉及符号位.
https://blog.csdn.net/Jason_M_Ho/article/details/78700434
补充一下:
为什么memset(a,-1,sizeof(a))可以赋值成-1。
我之前也没关注这个问题。原码是1000,0001-反码是1111,1110,补码是1111,1111
按照上面的按4个字节的补码赋值得到-1111,1111。
附上4个字节后
1111,1111 1111,1111 1111,1111 1111,1111
得到的答案还是-1.
因为默认了在补码里-1=1111,1111;
为了的就是表示0 的运算,1 + (-1)=0
所以-1=0000,0000-0000,0001
-1=1111,1111