把一个数用二进制形式表示,如果是正数,原码就等于其二进制数,如果是负数,最高位,也就是最左边的那一位变成1
把一个数表示成二进制的时候注意,一定要比正常表示的二进制多4位,用来标记是正数还是负数
比如:12可以表示成1100,但是写的时候要比它多四位,也就是 0000 1100,最高位为0,表示为正,如果是-12,就是1000 1100
25可以表示成0001 1001,要比它多四位,所以写成 0000 0001 1001,-25写成 1000 0001 1001
如果是正数,补码就等于其原码
如果是负数,除了符号位,其它全部取反,然后得到一个整数,再+1,转换成二进制,和原来的前四位的反码组合,就是其补码
比如:-12,原码为1000 1100,全部取反,1111 0011,这个二进制等于3,只计算后四位,前四位是表示是正数还是负数,不参与计算,3+1=4,表示成原码,就是1111 0100
原码左边第一位,正数为0,负数为1
正数:先全部取反,然后求其补码
负数:先求其补码,再全部取反
12:原码 0000 1100 全部取反 1111 0011,补码:1000 1101 最高位为1 表示为负数,后四位计算为13,所以~12=-13
-12:原码 1000 1100 补码:1111 0100 全部取反 0000 1011 最高位为0 表示为正数,后四位计算为11,所以~-12=11
正数和负数的取补,为其相反数减一
比如上面的~12=-13,~-12=11,可以求证 ~23=-24 ~-23=22
原码:将最高位作为符号位(0表示正,1表示负),其它数字位代表数值本身的绝对值的数字表示方式。
反码:如果是正数,则表示方法和原码一样;如果是负数,符号位不变,其余各位取反,则得到这个数字的反码表示形式。
补码
:如果是正数,则表示方法和原码一样;如果是负数,则将数字的反码加上1(相当于将原码数值位取反然后在最低位加1)。
总结:正数的原码、反码、
补码
完全一样,只有负数需要按照以上规则计算。
还原出原码:1000 0111(此时为负数,按照规定:原码为负数的反码就是符号位不变,其余数 0变1,1变0。还原出反码:1111 1000(此时因为取反后为负数,按照规定:负数的
补码
是反码符号位不变,最后一位+1,所以
补码
的最后一位-1得到负数的反码。还原出反码:0000 0110(此时取反后为正数,按照规定:正数的
补码
就是本身,所以本身就是反码。原码--->反码--->
补码
--->对
补码
按位
取反(包括符号位也需要取反)--->拿到取反后的
补码
--->对
补码
还原出反码--->对反码还原出原码。
Console.WriteLine($"与(&)操作符的位都为1时,才为1,其他都为0,因此与(&)操作符的结果范围在[0, Math.Min(x,y)],x,y均为正整数");
Console.WriteLine($"或(|)操作符的位都为0时,才为0,其他都为1,因此或(|)操作符的结果范围在[Math.Max(x,y), x+y],x,y均为正整数");
Console.WriteLine($"非(~)操作符
按位
取反,1转化为0, 0转化为1,因此非(~)操作符满足[x+~x=-1]一个数与其取反操作之和为-1");
Console.WriteLine($"异或(^)操作符的位不同时为1, 位相同时为0");
Console.WriteLine($"左移(<<)操作符:【最左侧位不要,在最右侧补0】,相当于乘以2个N次方,【移位是除以32后的余数,范围[0,31],即以32为一个周期】");
Console.WriteLine($"右移(>>)操作符:【最右侧位
明明我们用正数用的更多,如果把0归到负数里面,那么正数就是整的2次方了。为什么不这么做呢?如果你的手表快了20分钟,你可以:1.把他调慢20分钟2.再调快11小时40分钟其实负数就是一个特别大的正数。CPU没有做出来减法这种电路。所有的减法都是加上这个数的负数,然后用溢出来完成的。并且使用这种方法储存数据,不需要把符号位单独拿出来算。只要跟着右边的比特一起算加法就行了。因此,0只能划分到较小的正数那一块了。
正数的
补码
就是源码:
负数的
补码
是符号位不变,符号位不计入计算(1为负数,最高位是符号位),其余位取反,然后加1,然后把除了符号位的数据加个负号即可,因为计算出来的值是正值。
private Int32 GetComplementCode(int value)
byte symbol = (byte)(value >> 15);
if (symbol != 0)//负数
#include #define N 8 //这里你要求是8位int main(int argc, const char * argv[]) {int binary[8];//用于存放最后取得的
补码
int a=0;//要处理的数值int a1=0;//保存a的值int m=0;//用于存放临时的数值printf("请输入要转换成二进制
补码
的数的值:\n");scanf("%d",&a);a...