关于long转int

604 阅读2分钟

尝试将2147483648L转换为int类型,发现结果是-2147483648。原因在于将long类型转换为int类型,就是取64位的long类型的低32位;计算机存储数字是使用补码;Java语言存储的整数都是有符号类型,也就是说无论是32位的int类型,还是64位的long类型,其首位的二进制都是符号位(首位为1表示负整数)。

补码:将原码的除符号位以外的位取反后变成反码,再将反码加1.
	以8位的整数-10为例:原码10001010,反码11110101,补码11110110
虽然使用补码不容易直接看出二进制代表的十进制是什么,但是解决了有符号整数0存在+0和-0这两个0的问题,还是以8位的0为例,10000000表示-0,00000000表示+0,但是要是使用补码的话,0只能用00000000表示,规定10000000表示-2 ^ 7,即-128。

再回到刚开始的例子上去,对于2147483648L而言,其补码为0000...1000...(1后面有31个的0),此时取低32位就是10000000000000000000000000000000(注意:这里是补码,并且1开头后面全是0的补码规定就是-2 ^ (具体位数 - 1)),就是-2147483648