3 回答
TA贡献1966条经验 获得超4个赞
我不知道为什么它将长数据类型称为int
它不是。您应该学会信任编译器消息(尤其是当它们来自健全,现代的编译器而不是古老的C / C ++编译器时)。尽管他们有时说的语言可能很难理解,但他们通常不会对您说谎。
让我们再来看一看:
int 9223372036854775807的文字超出范围。
注意,它在任何地方都没有提及您的变量testLong或类型long,因此它与初始化无关。该问题似乎在其他时候发生。
现在让我们研究消息的某些部分:
int告诉我们他想将某些东西视为一种int价值(这不是您想要的!)
“超出范围”非常清楚:某些内容不在预期范围内(可能是int)
“文字”:现在很有趣:什么是文字?
我将离开舒适的列表,讨论一下文字:文字是在代码中具有一定价值的地方。有String文字,int文字,class文字等等。每次您在代码中明确提及一个值时,它都是文字。
因此,它实际上并不是在困扰您关于变量声明,而是数字本身,值就是在困扰您。
您可以在a long和an int均可接受的上下文中使用相同的文字来轻松地验证这一点:
System.out.println(9223372036854775807);
PrintStream.println可以带一个int或一个long(或几乎其他任何东西)。这样的代码就可以了,对吧?
不会。也许应该这样,但是根据规则,这样做并不好。
问题在于“某些数字”被定义为int文字,因此必须在定义的范围内int。
如果要编写long文字,则必须通过附加L(或小写)使其明确l,但我强烈建议您始终使用大写形式,因为它更容易阅读且更容易被误认为是1。
请注意,float(postfix F/ f)和double(postfix D/ d)也会发生类似的问题。
旁注:您将意识到没有byteor short文字,您仍然可以将值(通常是int文字)分配给byte和short变量:这可能是由于§5.2中有关Assignment Converson的特殊规则所致:它们允许分配较大类型的常量表达式到byte,short,char或int 如果值是类型的范围内。
TA贡献1773条经验 获得超3个赞
long ak = 34778754226788444L/l;
两者都使用,但一次只能使用大写L或小写l。
为什么要使用L / l?因为long是整数数据类型的一部分。
添加回答
举报