声明: 本文档只解释补码的位级的实现原理,具体的实用方法各位朋友可以直接百度找关键字补码即可.
片外话:计算机对整型数据的编码形式有很多种,不同的机器(编译器)会有不同的编码方式.例如补码,反码,源码.
补码( two's complement): 现在大多数计算机使用的编码方式.
首先引出来一个问题:定义一个char类型的数据。也就是开辟了一个字节的形式。它的取值范围是-128—127,为什么负数的范围会比正数的范围大呢?
由于最高有效位是符号位 ,那么127的二进制形式是 0111 1111
-128的二进制形式是:1000 0000 还是1111 1111呢?
解答:
上面所指的都是有符号的整数数据类型,也就是存在正负的概念的。
大家也应该知道二进制怎么转换成十进制的形式,每一位上的值乘以相对应的权值。
补码的位级别的形式就是根据每一位的权值来定义的。无论是正数还是负数,只要是有符号的数并且机器是用补码的形式来编译程序的。
在使用补码时,最高有效位的值扮演者表现符号和确切数值的角色。
无论是正数还是负数的, 最高有效位的权值变为了负的。 负的 这就是关键!!!!
例如:
一个正整数 2 :补码是0000 0010 (计算机中的存储形式)
变成十进制是0*(-2^7)+ 0*2^6 +0*2^5 +0*2^4 +0*2^3 +0*2^2 +1*2^1 +0*2^0 = 2
一个负整数 -127 :补码是1000 0001 (计算机中存储形式)
变成十进制是1*(-2^7)+ 0*2^6 +0*2^5 +0*2^4 +0*2^3 +0*2^2 +0*2^1 +1*2^0 = -128+1=-127
-128: 补码是1000 0000
变成十进制是1*(-2^7)+ 0*2^6 +0*2^5 +0*2^4 +0*2^3 +0*2^2 +0*2^1 +0*2^0 = -128
-1:补码是1111 1111
变成十进制是1*(-2^7)+ 1*2^6 +1*2^5 +1*2^4 +1*2^3 +1*2^2 +1*2^1 +1*2^0 = -128+127=-1
整数和负数取值范围主要的差别是:0000 0000 = 0 (不算是正数的范围)
1000 0000 =-128 (算负数的范围)
有个这个基础之后,就会自然的理解传说中的 “按位取反在加1“ 是什么含意了
一家之言,欢迎拍砖!