inttypes的文字xyz超出范围

我现在正在使用Java中的数据types,如果我已经正确理解, longtypes接受的值在以下范围之间:-9,223,372,036,854到+9,223,372,036,854,775,807。 现在你可以在下面看到我创build了一个名为testLong的Longvariables,虽然当我插入9223372036854775807作为值时,我得到一个错误,指出:

“inttypes的文字9223372036854775807超出范围”。

我不知道为什么它是指long数据types为int

任何人有任何想法?

代码如下:

 char testChar = 01; byte testByte = -128; int testInt = -2147483648; short testShort = -32768; long testLong = 9223372036854775807; float testFoat; double testDouble = 4.940656458412; boolean testBool = true; 

最后加上大写L

 long value = 9223372036854775807L; 

否则,编译器会尝试将文字parsing为一个int ,因此会出现错误信息

我不知道为什么它是指长数据types为int

不是这样。 你应该学会信任编译器消息(特别是当它们来自理智的,现代的编译器而不是古老的C / C ++编译器时)。 虽然他们说的语言有时可能很难破译,但他们通常不会对你说谎。

我们再来看一下:

int 9223372036854775807的文字超出范围。

请注意,它没有提到你的variablestestLong或typeslong任何地方,所以它不是关于初始化。 这个问题似乎发生在其他一些地方。

现在我们来调查消息的一些部分:

  • int告诉我们他想把某些东西当作一个int值(这不是你想要的!)
  • “超出范围”是非常清楚的:有些东西不在预期的范围内(可能是int
  • “文字”:现在有趣的是:什么是文字?

我将离开舒适的列表来谈论文字:文字是你的代码中有一些价值的地方。 有String文字, int文字, class文字等等。 每当你在你的代码中明确地提到一个值时 ,它就是一个文字。

所以实际上并没有在variables声明中唠叨你,而是数字本身,它的价值就在于你在唠叨什么。

你可以很容易地validation这一点,通过使用相同的文字在一个longint是同样可以接受的上下文:

 System.out.println(9223372036854775807); 

PrintStream.println可以采取一个int或一个long (或几乎任何其他)。 所以,代码应该没问题吧?

不,也许应该是这样,但根据规则,这不好的。

问题是“一些数字”被定义为一个int文字 ,因此必须在由int定义的范围内。

如果你想写一个long文字,那么你必须通过附加L (或小写l来明确,但我强烈build议你总是使用大写变体,因为它更容易阅读和更难以误认为1 )。

请注意, float (后缀F / f )和double (后缀D / d )也会出现类似的问题。

注意:你会意识到没有byteshort文字,你仍然可以为byteshortvariables赋值(通常是int文字):由于第5.2节有关Assignment Converson的特殊规则,这是可能的:它们允许分配常量如果值在types范围内, 则将较大types的expression式转换为byteshortcharint

试试做9223372036854775807L