补码:正数的补码是其本身! ,负数的补码=反码+1
可以通过补码运算,通过最高位和次高位的进位相异或可以判断计算结果是否溢出。
计算机中的有符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。
正整数的补码是其二进制表示,与原码相同。
例:+9的补码是00001001。(备注:这个+9的补码是用8位2进制来表示的,补码表示方式很多,还有16位二进制补码表示形式,以及32位二进制补码表示形式,64位进制补码表示形式等。每一种补码表示形式都只能表示有限的数字。)
负数解释:
求负整数的补码,将其原码除符号位外的所有位取反(0变1,1变0,符号位为1不变)后加1。
同一个数字在不同的补码表示形式中是不同的。比如-15的补码,在8位二进制中是11110001,然而在16位二进制补码表示中,就是1111111111110001。以下都使用8位2进制来表示。
先一步步来 8位的-29的二进制原码10011101 反码11100010 补码11100011 -25的原码10011001 反码11100110 补码11100111 然后就是两个数的补码相加11100011+11100111得11001010 这个结果也是反码 化成原码就是减1再取反得10110110 最高位是符号位所以化成10进制就是-54 就是这么得来的。计算时都要溢出的 否则计算就会错误 补码也就没意义了 所以希望你能懂溢出的原因!计算错误,溢出分上溢和下溢。两个大数相加得出的书比任何一个数都小,这就是上溢!这个跟你的寄存器的大小有关系,比如说你的寄存器大小是-9999到9999,你计算8888+2222正确结果是10000,但是结果超出寄存器的有效数了,当然移位器就会在右移 *** 作中把1移掉了(为了便于理解,我这把计算机的计算都认为是十进制的,实际上计算机是以二进制在进行计算,其中的移位 *** 作不难,但是很繁琐,就不详述了)!下溢道理也是一样。当你用-6666-4444本来该等于-10000,但是在左移过程中丢失了最低位,就造成下溢出了,希望对你有所帮助有符号int型数据的取值范围是-32768~32767,2个字节总共16位,第一位为符号位,正数的话第一位为0,负数则为1,整数的取值最大是第一位为0,其后的十五位全为1,算过来也就是32767,如果如题所说,加上1之后,第一位变为1,其余十五位全为0,转换一下,其十进制数据就是2的15此方,因为第一位为1,为负数,所以结果为-的2的15此方,也就是-32768~~~72+98=-42,两正数相加结果为负,这就是溢出。另外一个溢出的情况是:两负数相加结果为正。溢出产生的原因就是你所想要表示的数超过的所给位数的最大能力,八位二进制数用补码表示数的范围在+127~-128,你这道题的结果是170,已超出这个范围,所以就溢出了。解决的办法就是增加位数,这道题只要把位数增加到16位就不会溢出了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)