Java基础(二):原码、反码、补码及进制之间的运算

Java基础系列文章

Java基础(一):语言概述

Java基础(二):原码、反码、补码及进制之间的运算

Java基础(三):数据类型与进制


目录

  • 一、不同进制的表示方式
  • 二、二进制
  • 三、进制之间的转换
  • 四、byte的取值范围


一、不同进制的表示方式

  • 所有数字在计算机底层都以二进制形式存在
  • 对于整数,有四种表示方式
    • 二进制(binary):0,1 ,满2进1,以0b0B开头
    • 十进制(decimal):0-9 ,满10进1
    • 八进制(octal):0-7 ,满8进1,以数字0开头表示
    • 十六进制(hex):0-9及A-F,满16进1,以0x0X开头表示。此处的A-F不区分大小写。如:0x21AF +1= 0X21B0
十进制 二进制 八进制 十六进制
0 0 0 0
1 1 1 1
2 10 2 2
3 11 3 3
4 100 4 4
5 101 5 5
6 110 6 6
7 111 7 7
8 1000 10 8
9 1001 11 9
10 1010 12 a或A
11 1011 13 b或B
12 1100 14 c或C
13 1101 15 d或D
14 1110 16 e或E
15 1111 17 f或F
16 10000 20 10

二、二进制

  • 计算机数据的存储使用二进制补码形式存储,并且最高位是符号位
    • 正数:最高位是0
    • 负数:最高位是1
  • 规 定
    • 正数的补码与反码、原码一样,称为三码合一
    • 负数的补码与反码、原码不一样:
      • 负数的原码:把十进制转为二进制,然后最高位设置为1
      • 负数的反码:在原码的基础上,最高位不变,其余位取反(0变1,1变0)
      • 负数的补码:反码+1

为什么要使用原码、反码、补码表示形式呢?

  • 主要要解决的问题就是负数的表示
    1. 假设我们有正数0000 1111,我们如何表示其相反数呢?
    2. 一般我们的思路是,找一个数,跟它相加的结果等于0,但是我们发现,要找出一个与它相加后结果等于0的数还是要略加思考一下的(因为要计算进位)
    3. 所以,为何不找出一个与它相加后结果是1111 1111的数,然后该数+1即是我们所要的答案啦
    4. 于是,很容易的,0000 1111 + 1111 0000 + 1 = 1111 1111 1111 1111 + 1 = (1)0000 0000 (超过最高位数的1舍去)
    5. 一目了然,1111 0001 就是我们想要的答案了
    6. 那么我们是怎么得到这个相反数的呢?
      • 首先,找出一个数与它加起来结果是全1的,这个数便是它的反码
      • 然后这个数再加1,这便是它的相反数了,也是我们说的补码
      • 我们检验一下0的情况,0000 + 1111 + 1 =(1)0000,其中1111 + 1 = (1)0000 = 0000,即+0和-0的二进制表示均为0000

三、进制之间的转换

二进制 转 十进制

Java基础(二):原码、反码、补码及进制之间的运算_第1张图片

十进制 转 二进制

Java基础(二):原码、反码、补码及进制之间的运算_第2张图片

二进制与八进制转换

Java基础(二):原码、反码、补码及进制之间的运算_第3张图片

四、byte的取值范围

  • byte 在计算机中是8位;第一位为符号位。0表示正数,1表示为负数,其余的7位表示具体的值
  • 数值在计算机内存中的存储是补码的方式
  • 正数最大为0111 1111,十进制表示形式为127
  • -0的原码是1000 0000,反码是 1111 1111,补码是 10000 0000 ,因为byte只识别8位字节,所以补码是 0000 0000
  • +0的原码是 0000 0000 ,反码补码都是其本身,还是0000 0000
  • 对于0来说,底层存储补码,就只有0000 0000,把-0和+0都包括了
原码 -1 是  1000 0001 ,   -127是 1111 1111

反码    是  1111 1110 ,       是 1000 0000

补码    是  1111 1111 ,       是 1000 0001
    
即补码 1111 1111 到补码 1000 0001 表示 -1 到 -127   
  • 负数的补码还有一个空缺,1000 0000,这个就作为了-128的补码
    • -128 + 1 = -127也就是 1000 0000 + 0000 0001 = 1000 0001,运算起来也合理
  • -128只有补码,没有原码和反码(因为推算回去原码是0000 0000)

-128在byte类型中怎么存储?

Java基础(二):原码、反码、补码及进制之间的运算_第4张图片

你可能感兴趣的:(java,开发语言)