函数解释memset()(127,128,-1,0) 图文解释

参考资料:

https://blog.csdn.net/yang_zongjun/article/details/39025581

有很多博客的确介绍了怎么具体操作。

但是我有些不理解它实际的计算,所以自己写一篇博客,以后人为鉴:

贴上代测代码:

#include<bits/stdc++.h>
using namespace std;
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

 

  • 12
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值