计算机中的数字是以二进制方式存储的,第一个二进制位为符号位,0代表正数,1代表负数
原码、反码、补码是计算机中存储数字使用的编码
1、原码、反码、补码的概念
原码:符号位加上这个数绝对值
例如正整数1的8位二进制原码为 00000001 负整数-1的8为二进制原码为 10000001
反码:正数的反码就是其本身,负数的反码就是在原码的基础上除符号位外所有的位取反
例如正整数1的8位二进制原码为 00000001 则其反码还为 00000001
负整数-1的8为二进制原码为 10000001 其反码为 11111110
补码:正数的补码是其本身,负数的补码为其反码再加1
例如正整数1的8位二进制原码为 00000001 则其补码还为 00000001
负整数-1的8为二进制原码为 10000001 其反码为 11111110 其补码为 11111110 + 00000001 = 11111111
2、Java语言中的数字是以补码方式存储的
验证如下:
由负整数10无符号右移一位得正2147483643可知Java中数字的存储方式为补码
分析:
如果存储方式为原码 则-10 存储的二进制表示为 10000000 00000000 00000000 00001010 无符号右移一位 得 01000000 00000000 00000000 00000101 此数十进制为 1073741829
如果存储方式为反码 则-10 存储的二进制表示为 11111111 11111111 11111111 11110101 无符号右移一位 得 01111111 11111111 11111111 11111010 此数十进制为 2147483642
如果存储方式为补码 则-10 存储的二进制表示为 11111111 11111111 11111111 11110110 无符号右移一位 得 01111111 11111111 11111111 11111011 此数十进制为 2147483643
Java中负整数10无符号右移一位得正2147483643与存储方式为补码分析出来的结果相同
所以Java中数字存储方式为补码。