通常我们用4个字节也就是32位表示一个整数,最高一位是符号位。范围是-2,147,483,648 to 2,147,483,647,-231 ~231-1
为了讲解方便,我们用一个字节(byte)表示一个整数,如下:
十进制数字1的二进制表现形式: 0000 0001
十进制数字2的二进制表现形式: 0000 0010
有符号数和无符号的概念
规则:把二进制数中的最高位(最左边的哪位)用作符号位
对于有符号数,最高位被计算机系统规定为符号位(0为正,1为负)
对于无符号数,最高位被计算机系统规定为数据位
按照这种说法,比如有符号数+2 -2的原码形式:
+2= 0000 00010
-2=1000 00010
+1= 0000 0001
-1=1000 0001
————————————————————
1000 0010
我们发现-1+1的结果不得0?为了解决这个问题,在计算机学科中引入了原码、反码和补码的概念。在计算机中有符号数值都是以补码形势存在。
原码、反码、补码
原码:符号位:0表示正,1表示负; 数值位:数据真值的绝对值。
反码:正数的原码和反码一样,负数的反码是对应原码的符号位不变,数值部分按位求反。
补码:正数的原码、反码和补码一样,负数的补码等于反码加1
规则:
正数 原码=反码=补码
负数:反码=符号位不变,其它位取反
补码=反码+1
1的原码是 0000 0001
-1的原码是 1000 0001
-1的反码是 1111 1110
-1的补码是 1111 1111
重新计算-1+1的结果
1111 1111
0000 0001
——————————-
0000 0000
正数时 | 负数时 | 取值范围(8位) | o的表示方式 | |
原码 | 最高位为0,其它位为数据真值 | 最高位为1,其它位为数据真值 | -127 ~ +127 | +0 = 0 0000000 – 0 = 1 0000000 |
反码 | 同上 | 最高位为1,按原码每位对应取反 | -127 ~ +127 | [+0]反 = 00000000 [-0]反 = 11111111 |
补码 | 同上 | 在反码基础上加1 | -128 ~ +127 | [+0]补= [-0]补= 00000000 |
⽤8位的⼆进制来表⽰⼀个数,它的范围是-128~127,⽤⼋位的⼆进制来表⽰,-128补码是10000000
n位补码表示数值的范围是: -(2n-1)~+(2n-1-1)