正负进制转换及java基本数据类型取值范围推算

十进制转二进制("除2取余,逆序排列"法)

概念

原码:
一个正数,按照绝对值大小转换成的二进制数;一个负数按照绝对值大小转换成的二进制数,然后最高位补1,称为原码。
正数与负数二进制表示的区别就在于最高位,最高位1表示负数,最高位0表示正数。

反码: 正数的反码与原码相同,负数的反码为对该数的原码除符号位(最高位/最右的位)外各位取反,1变0; 0变1。
举例:8的二进制(假如2字节)表示:00001000,反码也是00001000。-8的二进制(假如2字节)表示:10001000(就是将8的二进制最高位置为1,所以负数二进制非常简单),反码是11110111。

补码: 正数的补码与原码相同,负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1,也就是对反码最后一位加1,
-8的原码:10001000,反码是11110111,补码就是:11111000。

官方解释:
①原码表示法规定:用符号位和数值表示带符号数,正数的符号位用“0”表示,负数的符号位用“1”表示,数值部分用二进制形式表示。
②反码表示法规定:正数的反码与原码相同,负数的反码为对该数的原码除符号位外各位取反。
③补码表示法规定:正数的补码与原码相同,负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1.
④正零和负零的补码相同,[+0]补=[-0]补=0000 0000B。

正数转换

十进制转二进制:用2整除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为小于1时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。
举例:8转二进制,8/2结果商4余0(记录起来),4(商)/2结果商2余0(记录起来),2(商)/2结果商1余0(记录起来),1(商)/2结果商0余1(记录起来),商小于1结束,倒序排列余数1000即8的二进制。
在这里插入图片描述

负数转换

负数的二进制表示用的是补码。举例-15转二进制:
15的二进制00001111,则-15二进制原码10001111,-15二进制反码:11110000,-15二进制补码:11110001,最终-15二进制表示为11110001。
如果根据11110001二进制转换十进制,步骤:1.最高位为1则是负数,转为反码11110000,转原码10001111,转十进制-(1x2的3次方+1x2的2次方+1x2的1次方+1x2的0次方)= -15。

java基本数据类型取值范围推算

以int类型为例子,其余举一反三

int类型的长度为4字节,也就是4x8=32个bit位。

a. 如果最高位为1也就是表示的负数,范围(10……0至11……1)
,如果最高位为0也就是表示的正数范围(00……0至01……1)。

b. 000000000……000是正数的最小值也就是0,同理0111111……111是正数的最大值也就是2的31次方-1,从2的0次方一直加到2的30次方=2的31次方-1,此为数学公式。
由此得出int类型的取值范围正数是从0至2的31次方-1.

c. 负数的取值范围有点意思,32位的10000……000000(这是补码),如果求反码即减一,则矛盾,所以硬性规定它就是十进制-0,也就是说在二进制中,0有两种表方法。+0的原码为0000 0000 0000 0000 0000 0000 0000 0000,-0的原码为1000 0000 0000 0000 0000 0000 0000 0000,因为0只需要一个,所以把-0拿来当做一个最小的数-2的31次方也就是-2147483648,其补码表示为1000 0000 0000 0000 0000 0000 0000 0000,在32位没有原码。

32位的10000……000001(此为补码–负数二进制用补码表示),求反码10000……000000,求原码11111……111111也就是-(2的31次方-1)。

32位的111…11…1111(最高位1为负数,此为负数补码因为负数二进制用补码表示,不用原码,原码用于计算),求反码1111…11…1110,求原码1000…000…0001也就是-(1x2的0次方)= -1

总结

java int类型的取值范围是 (-2^31) ~ (2^31-1),总共 2^32个数,int类型占用32bit位,恰好是二进制 2^32 种排列组合。

二进制转十进制方法(“按权相加”法)

二进制转为十进制要从右到左用二进制的每个数去乘以2的相应次方(当前数的下标次方,下标从0开始)。

1010转十进制方法:1010各个数下标分别为3210,这个下标就是接下来的2的对应次幂。
1010十进制=1x2^3 + 0x2^2 + 1x2^1 + 0x2^0=10

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值