Long.parseLong("XXX")或long number=xxxL
java long与int取值范围的问题
1:long l = 1024*1024*1024*4; //0
2:int i1 = 1024*1024*1024*4; //0
3:int i2 = 220000000000; //错误
4:long l1 = 220000000000; //错误
5:long l1 = 220000000000L; //正确
1-4都是超过int(-2^31 — 2^31-1)的范围首先 不如果不加L在后面标明
默认是int型 所以4是错误的 5是正确的
3明显溢出编译时就判断错已经超出范围
1与2主要涉及到乘法的问题
java在相乘之前不知道你的结果是否溢出
只有在相乘后并赋值的时候才知道超出了int类型和long类型的范围,应该是后台自己处理超出范围的数导致的结果
当前int型数据达到最大值2147483647时,是第一位为0,其余31位为全1,01111111111111111111111111111111;再加1则进1,第一位为1,其余全零,10000000000000000000000000000000。系统把第一位判断为负号,而且同时代表值,所以是-2147483648,当再继续相加时,系统会把之前的数当做负数,再加上正数1,则为-2147483647,10000000000000000000000000000001,后面以此类推。结合测试1,当为10000000000000000000000000000000时,即2147483648,再乘以2将溢出,溢出位娶不到,全0,即为00000000000000000000000000000000,此时为0(-2147483648再乘以2为什么是0的理解) . 再乘以2依然为0.
为什么32位机int取值范围是-2^31~2^31-1?为什么不是-2^31-1~2^31-1?
因为int类型总长度是2^32,所以对于有符号数来说,正负各占一半,也就是你说的2^31,但是由于0被划分到属于正数的范畴(但不是正数)所以正数要比负数少一个数
【最小值:-2^31】为什么不是-(2^31-1)?