关于原码,反码,补码以及数据的溢出
2017-11-18 14:18
316 查看
假设有个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)的值。符号也为正。
某个数值超出其上限,如果其有效二进制(比如char类型,只看后8位,int类型,只看后32位)的符号位为0,则其值为有效二进制的值,符号为正;相反,如果其有效二进制的符号位为1,将其有效二进制取反加一(或减一取反),符号为负。
如果某数超出其下限,先算出相对应上限(比如-130相对应上限为130)的值,然后符号跟相对应的上限的符号相反即可。
对于无符号的数据类型:
某个数值超出其上限,值为其有效二进制的值。符号为正。
如果某数超出其下限,值为:此数据类型的最大取值加1(加1是因为无符号类型,0也占了一位),然后减去此数值相对应上限(同上,比如-300的相对应上限为300)的值。符号也为正。
相关文章推荐
- 原码反码和补码以及Java中数据溢出问题
- 关于原码反码补码以及位元算
- 数据大小溢出时相应的原码、反码与补码表示
- JAVA基础学习总结---原码、补码、反码以及基本数据类型
- java学习总结(06,05.16)计算机对数据的储存方式以及原码反码补码的概念
- 关于计算机中的原码、反码、补码的区别
- C语言中八进制和十六进制怎么表示以及原码、反码、补码、C语言按位取反运算符~
- 原码、反码、补码,以及负数的位操作
- 数据的原码,反码和补码的表现形式(转载)
- 原码、反码、补码以及为什么要用反码和补码
- 原码, 反码, 补码 详解以及负数的按位与运算
- java 变量及数据类型、原码、反码、补码
- 有关原码、反码以及补码的一些想法
- Java原码、反码和补码的算法,Java跨平台原理,以及JDK安装目录说明
- 关于原码、反码、补码、移码与浮点数数值上规律的归纳
- 关于汇编中的NEG指令正解!(补码,反码,原码)现实意义
- 二进制数据与原码、反码、补码
- 关于原码、反码和补码(网上转载)
- 关于反码,byte最大值127,最小值-128的由来缘由以及书本上从未讲解过的反码补码功能作用
- 关于-128的原码、反码和补码问题