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

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

一、不同进制的表示方式

  • 所有数字在计算机底层都以二进制形式存在
  • 对于整数,有四种表示方式
    • 二进制(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

三、进制之间的转换

二进制 转 十进制

在这里插入图片描述

十进制 转 二进制

在这里插入图片描述

二进制与八进制转换

在这里插入图片描述

四、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类型中怎么存储?

在这里插入图片描述

相关文章
|
6月前
|
Java
【Java基础面试十一】、int和Integer有什么区别,二者在做==运算时会得到什么结果?
这篇文章解释了Java中`int`基本数据类型和其包装类`Integer`之间的区别,并指出在进行`==`运算时,`Integer`会拆箱为`int`类型,然后比较它们的值是否相等。
【Java基础面试十一】、int和Integer有什么区别,二者在做==运算时会得到什么结果?
|
6月前
|
存储 Oracle Java
01 Java概述基础与计算机基础(DOS+进制+原码反码补码)
01 Java概述基础与计算机基础(DOS+进制+原码反码补码)
62 17
|
7月前
|
Java Apache Maven
Java:commons-codec实现byte数组和16进制字符串转换
在上述代码中,`Hex.encodeHexString(bytes)`用于将byte数组转换为16进制字符串,`Hex.decodeHex(hexString)`用于将16进制字符串转换为byte数组。
138 0
|
7月前
|
Java Apache Maven
Java:commons-codec实现byte数组和16进制字符串转换
在上述代码中,`Hex.encodeHexString(bytes)`用于将byte数组转换为16进制字符串,`Hex.decodeHex(hexString)`用于将16进制字符串转换为byte数组。
148 0
|
9月前
|
存储 算法 Java
Java赋值运算
Java赋值运算
50 3
|
8月前
|
算法 Java
Java将16进制的字符串转换为10进制数的方法
【6月更文挑战第27天】Java将16进制的字符串转换为10进制数的方法
2047 0
|
8月前
|
Java
java实现字符串与十六进制字符串互转
java实现字符串与十六进制字符串互转
|
8月前
|
算法 Java
Java数据结构与算法:位运算之与、或、异或运算
Java数据结构与算法:位运算之与、或、异或运算
|
1月前
|
监控 Java
java异步判断线程池所有任务是否执行完
通过上述步骤,您可以在Java中实现异步判断线程池所有任务是否执行完毕。这种方法使用了 `CompletionService`来监控任务的完成情况,并通过一个独立线程异步检查所有任务的执行状态。这种设计不仅简洁高效,还能确保在大量任务处理时程序的稳定性和可维护性。希望本文能为您的开发工作提供实用的指导和帮助。
93 17
|
2月前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者