memset的使用以及原码反码补码.md

本文探讨了原码、反码和补码在8位计算机中的设计,特别是-128没有原码和反码的情况。负数在计算机中以反码存储。接着介绍了memset函数的用途,它用于填充内存区域的每个字节,常用于内存初始化,特别是设置为-1的两种实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原码反码补码的设计是为了计算机算加法与减法(为简化,此处使用的是8位)

正数的原码=反码=补码
负数情况较为复杂:负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
[-1] = [10000001]原 = [11111110]反 = [11111111]补
计算机必然不会去区分符号位,因此符号位是要参与计算的,如果使用原码计算:
1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2
使用反码计算:
1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原= [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0
使用补码计算:
1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]补 + [1111 1111]补 = [1 0000 0000 ] = [0000 0000]补=[0000 0000]原
这样0用[0000 0000]表示, 而以前出现问题的-0则不存在了.而且可以用[1000 0000]表示-128:
(-1) + (-127) = [1000 0001]原 + [1111 1111]原 = [1111 1111]补 + [1000 0001]补 = [1 1000 0000]= [1000 0000]补
-1-127的结果应该是-128, 在用补码运算的结果中, [1000 0000]补 就是-128. 但是注意因为实际上是使用以前的-0的补码来表示-128, 所以-128并没有原码和反码表示.(对-128的补码表示[1000 0000]补算出来的原码是[0000 0000]原, 这是不正确的)

-128并没有原码和反码表示

计算机中负数是以反码方式存储

memset的使用

功能

将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作,其返回值为指向S的指针。

 要注意的是,memset是对字节进行操作,所以上述程序如果改为

  int array[5] = {1,4,3,5,2};

  for(int i = 0; i < 5; i++)

  cout<<array[i]<<" ";

  cout<<endl;

  memset(array,1,5*sizeof(int));// 注意 这里与上面的程序不同

  for(int k = 0; k < 5; k++)

  cout<<array[k]<<" ";

  cout<<endl;

  输出的结果就是:

  1 4 3 5 2

  16843009 16843009 16843009 16843009 16843009

  为什么呢?

  因为memset是以字节为单位就是对array指向的内存的5个字节进行赋值,每个都用ASCII为1的字符去填充,转为二进制后,1就是00000001,占一个字节。一个INT元素是4字节,合一起就是00000001000000010000000100000001,就等于16843009,就完成了对一个INT元素的赋值了。

memset只填充1个字节(8位)

int first[10+1],next[10+1];
memset(first,-128, sizeof(first));
for (int j = 0; j < 11; ++j) {
    cout << first[j] <<" ";
}
int a = 0x80808080;//(0x80 = 1000 0000 = -128的补码)
cout <<" "<< a <<endl;
输出:-2139062144 -2139062144 -2139062144 -2139062144 -2139062144 -2139062144 -2139062144 -2139062144 -2139062144 -2139062144 -2139062144  -2139062144

memset初始化为-1

int first[10+1],next[10+1];
memset(first,-1, sizeof(first));
for (int j = 0; j < 11; ++j) {
    cout << first[j] <<" ";
}
int a = 0xffffffff;//(0xff = 1111 1111 = -1的补码)
cout <<" "<< a <<endl;
输出:-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1  -1

另一个初始化为-1的实现方式

    int first[10+1],next[10+1];
    memset(first,255, sizeof(first));
    for (int j = 0; j < 11; ++j) {
        cout << first[j] <<" ";
    }
//    int a = 0x7f7f7f7f;//(0x7f = 0111 1111 = 127的补码)
    int a = 0xffffffff;//(0xff = 1111 1111 = 255的补码)
    cout <<" "<< a <<endl;
输出:-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1  -1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值