【JavaSE】原码,反码,补码计算规则;基本数据类型取值范围的计算原理

原码反码补码概念和计算

补码是计算机底层存储数据的方式

  1. 对于正数:
    原码:最高符号位为0,其他按数计算
    反码、补码都与原码一样。

  2. 对于负数:
    原码:最高符号位为1,其他按数计算
    反码:原码中除符号位,其他的数值位按位取反,即0变1,1变0
    补码:反码+1

  3. 以byte类型示例:
    byte是1个字节,一个字节为1Byte = 8 bit位

  • 1的原码,反码,补码:0000 0001

  • -1的原码:1000 0001
    反码:1111 1110
    补码:1111 1111

  • 24的原码,反码,补码为:0001 1000
    在这里插入图片描述

  • -24的原码:1001 1000
    反码:1110 0111
    补码:1110 1000

基础数据类型取值范围的计算

  1. byte数据类型1字节
    0000 0000 = +0
  • 最大正数的原码,补码:0111 1111 = 2^7 - 1
  • 最大负数的原码 1000 0000
    反码 :1111 1111
    补码:1000 0000 = - 2^7
    原码: 1000 0000 = - 0 看起来代表-0但底层代表 - 2^7

分析:相当于是把-0默认定为-2^(bit位-1)一个最高位做符号位,而-0的补码,相当于最高位又做负数符号又算作数值位,所以取值范围负数比正数多一个-0-2^(bit位-1)其他字节依次类推

  1. short 2字节
    00000000 00000000 = +0
  • 最大正数的补码:01111111 11111111 = 2^15 - 1
  • 最大负数的补码:10000000 00000000 = - 2^15
    反码: 11111111 11111111
    原码:10000000 00000000 = - 0 = - 2^15
  1. int 4 字节
    00000000 00000000 00000000 00000000 = +0
  • 最大正数的补码:01111111 11111111 11111111 11111111 = 2^31 - 1
  • 最大负数的补码:10000000 00000000 00000000 00000000= - 2^31
    反码:11111111 11111111 11111111 11111111
    原码:10000000 00000000 00000000 00000000 = - 0 = - 2^31

原理:
有两种0的表示方法,即“+0”和“-0”。
实际上,在32位系统下int类型中,我们计算机已经强行规定了这种情况,数字0采用“+0”的表示方法,即00000000 00000000 00000000;而“-0”这个特殊的数字被定义为了-2^31。
无符号整形,4字节,32位全是数值位。

类型名称占字节数取值范围
int4B-2^31 ~ 2 ^31-1
unsigned int4B0 ~ 2^32

简单理解就是:
例如8个bit位,假设最高位也是数值位,因为最低位是2^0,所以1000 0000 == 2^7,所以 正负最大的值原码都是0111 1111 = 2^7 - 1,1111 1111 = -2^7 - 1(因为1000 0000 - 1 = 0111 1111)

但是有特殊情况,就是 - 0,+ 0 == 0000 0000。- 0不是0而是代表最高位符号也算作值的特殊情况
即最大负数的原码 1000 0000
反码 :1111 1111
补码:1000 0000 = - 2^7
所以最终范围是-2^7 ~ 2&7 - 1

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值