关于原码,反码,补码以及数据的溢出

转载来自:https://blog.csdn.net/lulu_1085/article/details/78568542 (侵删)

假设有个char类型的变量a,将10赋值给变量a,a用十进制表示是10,用二进制表示是00001010,对于计算机而言,00001010就是原码。但是,用原码在解决减法时会出现问题,比如:-2+(-2)= -4,用二进制表示就是:10000010 + 10000010 =00000100,结果为4,显然是错的,为了解决这种问题,就出现了反码和补码,。
反码的规则:符号位为0的,反码跟原码一样,符号位为1的,除过符号位,其余位取反。
补码的规则:符号位为0的,补码还是跟原码一样,符号位为1的,在反码的基础上加1。10000010(原码)+ 10000010(原码)=11111101(反码)+11111101(反码)=11111110(补码)+11111110(补码)=11111100(补码)=11111011(反码)=10000100(原码),这样就会解决上面减法的问题。
计算机中的数值是以补码形式存储的(只不过正数的补码跟原码一样)。
由此也可以推导出“数据的溢出”问题。当给某个数据类型的变量赋值一个超出其范围的值,可以将其看称“两个此数据类型范围之内的值的和”。例如:把130赋值给char类型的变量,超过了char类型的上限127,因此,可以将130看成127+3,在计算机里用二进制表示就是:01111111(补码)+ 00000011(补码) = 10000010(补码)=11111110(原码),即在计算机里,char类型的130存储的是-126。同样,如果把-130赋值给char类型的变量,超过了char类型的下限-128,可以将其看成-127 + (-3),10000001(补码)+11111101(补码)= 01111110(补码/原码),即在计算机里,char类型的-130存储的是126。不难看出,计算机处理溢出的数据是,溢出的数据是从另一端的极值开始算的,转圈。可以利用二进制算法的特性,得到结论:
对于有符号的数据类型
某个数值超出其上限,如果其有效二进制(比如char类型,只看后8位,int类型,只看后32位)的符号位为0,则其值为有效二进制的值,符号为正;相反,如果其有效二进制的符号位为1,将其有效二进制取反加一(或减一取反),符号为负。
如果某数超出其下限,先算出相对应上限(比如-130相对应上限为130)的值,然后符号跟相对应的上限的符号相反即可。
对于无符号的数据类型
某个数值超出其上限,值为其有效二进制的值。符号为正。
如果某数超出其下限,值为:此数据类型的最大取值加1(加1是因为无符号类型,0也占了一位),然后减去此数值相对应上限(同上,比如-300的相对应上限为300)的值。符号也为正。

猜你喜欢

转载自blog.csdn.net/qq_17130909/article/details/82753259
今日推荐