1.
如果是在字长为8位的计算机上, +0的原码是00000000 -0的原码是10000000 +0的反码是00000000 -0的反码是11111111 +0和-0的补码均为00000000
+0的补码: 00000000 -0的补码:第一步:11111111 第二步+1= 1 00000000 第三部:进位1被丢弃
为什么要引入补码?
由于计算机存储的数据一般是有位数限制的,那么两个数相加如果超出位数,那么超出部分就会自动丢失。 补码的形式就是利用了这个特点,方法是,对于正数相加没有特殊的,如果溢出了是正常的,而对于正数加负数这样的运算,算法是不需要考虑参与运算数据的符号, 直接两数进行二进制加的动作,结果也无需转换就是预期的,那么就需要将负数以补码形式存在,原理是这样,让一个数加上这个补码形式表现的负数时, 由于溢出自动丢失的效果,结果与减去这个负数的绝对值是相同的,这就是补码存放负数的实质,是定点CPU计算方面的特色之一。8位二进制原码 补码 反码的表示范围各是多少 怎么算的?
8位二进制原码的表示范围:-127~+127 8位二进制反码的表示范围:-127~+127 8位二进制补码的表示范围:-128~+127 n位二进制原码和n位二进制反码:-2^(n-1)-1~+2^(n-1)-1;n位二进制补码:-2^(n-1)~+2^(n-1)-1。
移位的目的是乘除2计算:
原码移位规则:![]()
![]()
![]()
补码移位规则:对于正数,符号位不变,不论左移还是右移,空出位一律以0补入
对于负数,符号位不变,左移后的空出位补0,右移后的空出位补1
![]()
![]()
有符号数,正数最高位为0, 负数最高位为1
有符号数右移时正数空位填0,负数空位填1
如:-2(在内存中存储为11111111 11111111 11111111 11111110),负数在内存中存储的形式以补码存储(也就是反码加1)
如果左移4位则a=11111111 11111111 11111111 11100000(在内存存储的格式)
用%d输出后十进制会是多少呢?
首先负数在内存中存储的格式转化成十进制后应该先减1再取反,即:a-1(11111111 11111111 11111111 11011111)
然后除符号位其余取反:10000000 00000000 00000000 00100000则该数值为-32,也就是-2左移4位后变为-32
同理-2右移4位,此时空位填1移动后在内存存储的形式为:11111111 11111111 11111111 11111111
用%d输出后十进制会是多少呢?
首先负数在内存中存储的格式转化成十进制后应该先减1再取反,即:a-1(11111111 11111111 11111111 11111110)
然后除符号位其余取反:10000000 00000000 00000000 00000001则该数值为-1,也就是-2右移4位后变为-1