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

来源:互联网 发布:python谷歌浏览器驱动 编辑:程序博客网 时间:2024/06/07 09:39

原码反码补码的设计是为了计算机算加法与减法(为简化,此处使用的是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
0 0
原创粉丝点击