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