java 里面 long 转换int内存分析

了解补码知识点

要将补码转换为十进制,需要确定补码的符号位。如果补码的符号位为1,则表示为负数,否则表示为正数。

假设我们有一个补码为1 0110 1011 1100 1101 1000 0011 1101 1100
0010 1101 1111 1101 1100 0001 1100 0011 0100
首先,确定符号位。根据补码的规则,最高位的1表示负数,因此这个补码表示一个负数。

将除符号位外的其余位取反。得到反码:0 1001 0100 0011 0010 0111 1100 0010 0011

将反码转换为原码。对于负数,反码加1即可得到原码:0 1001 0100 0011 0010 0111 1100 0010 0100

将原码转换为十进制。根据原码的规则,最高位的1表示负数,因此这个原码表示一个负数。

将其余位转换为十进制,得到的结果为:-539222988。

因此,补码101101011110011011000001111011100转换为十进制为-539222988

先考虑如何将二进制补码转换为十进制整数:
若符号位是0, 则该数是正数, 原码等同于补码. 可以由原码(也就是补码)得知代表的正整数.
若符号为是1, 则该数一定是负数, 可按照以下方式转换:
方式一: 先把符号位去掉, 把剩下的非符号位取反后得到一个无符号位的二进制序列, 将该二进制序列转换为十进制整数(注意:无符号位二进制序列代表的一定是正数),
将该整数加1得到的数便是原补码代表的整数的绝对值. 如: a = 1011(补码), 011取反得到100, 100代表4, 4+1=5,
|a|=5, a=-5.
方式二: 利用公式: (-1)2^(n-1) + 非符号位代表整数 = 值. 如a =1011(补码), n = 4, 011代表3 a = -12^3 + 3 = -5.

long转换为int

在Java中,将Long类型转换为int类型时,会发生类型转换和内存表示的变化。下面是转换的内存分析:

原始的Long类型的值以二进制补码形式存储在内存中。补码是一种表示有符号整数的方法,其中最高位表示符号位,0表示正数,1表示负数。

当将Long类型的值转换为int类型时,首先将Long类型的值截断为32位,只保留低32位。

如果截断后的32位二进制表示的值在int类型的范围内,转换的结果就是该32位二进制值。

如果截断后的32位二进制表示的值超出了int类型的范围,将发生溢出。溢出时,只保留截断后的32位二进制值的低32位,丢弃高位。

如果截断后的32位二进制值的最高位为1,表示负数,转换结果为负数的二进制形式。

示例1:

Long longValue = 1234567890L;
int intValue = longValue.intValue();

在这个示例中,longValue的
二进制: 10 1101 1111 1101 1100 0001 1100 0011 0100
二进制补码:0010 1101 1111 1101 1100 0001 1100 0011 0100

将其截断为32位后:1101 1111 1101 1100 0001 1100 0011 0100 (补码)
根据补码的规则,最高位的1表示负数,因此这个补码表示一个负数。将除符号位外的其余位取反。
方式一
按位取反得到反码:1010 0000 0010 0011 1110 0011 1100 1011
加1 得到原码
1010 0000 0010 0011 1110 0011 1100 1100 去掉第一位转换为十进制数为 539 222 988
1表示负数
转换为int类型的结果为:-539 222 988

方式二
按位取反:1010 0000 0010 0011 1110 0011 1100 1011 其对应的十进制数为 539 222 987
加1 539 222 988 |a|=539 222 988, a=-539 222 988
-10 0000 0010 0011 1110 0011 1100 1100
转换为int类型的结果为:-539 222 988

在这里插入图片描述
在这里插入图片描述

示例2:

Long longValue = 6444823059L;
int intValue = longValue.intValue();

在这个示例中,longValue的二进制
二进制: 1 1000 0000 0010 0100 0011 0010 0001 0011
补码: 0001 1000 0000 0010 0100 0011 0010 0001 0011

将其截断为32位后:1000 0000 0010 0100 0011 0010 0001 0011
根据补码的规则,最高位的1表示负数,因此这个补码表示一个负数。将除符号位外的其余位取反。
方式一
按位取反得到反码:1111 1111 1101 1011 1100 1101 1110 1100
加1 得到原码
1111 1111 1101 1011 1100 1101 1110 1101 去掉第一位转换为十进制数为 2 145 111 533
1表示负数
转换为int类型的结果为:-2 145 111 533

方式二
按位取反:1111 1111 1101 1011 1100 1101 1110 1100
其对应的十进制数为 2 145 111 532
加1 2 145 111 533 |a|=2 145 111 533, a=-2 145 111 533

转换为int类型的结果为:-2 145 111 533

在这里插入图片描述

在这里插入图片描述

示例3:

Long longValue = 6191460207L;
int intValue = longValue.intValue();

在这个示例中,longValue的二进制
二进制: 1 0111 0001 0000 1010 0010 1111 0110 1111
补码: 0001 0111 0001 0000 1010 0010 1111 0110 1111

将其截断为32位后:0111 0001 0000 1010 0010 1111 0110 1111
根据补码的规则,最高位的0表示正数,因此这个补码表示一个正数,正数的补码就是原码本身
0111 0001 0000 1010 0010 1111 0110 1111

转换为int类型的结果为:1 896 492 911

在这里插入图片描述
在这里插入图片描述

二进制在线转换地址
http://binary-converter.bchrt.com/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值