memset的用法

参考资料:

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

 

你可能感兴趣的:(Algorithm)