inttypes的文字xyz超出范围
我现在正在使用Java中的数据types,如果我已经正确理解, long
types接受的值在以下范围之间:-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这一点,通过使用相同的文字在一个long
和int
是同样可以接受的上下文:
System.out.println(9223372036854775807);
PrintStream.println
可以采取一个int
或一个long
(或几乎任何其他)。 所以,代码应该没问题吧?
不,也许应该是这样,但根据规则,这是不好的。
问题是“一些数字”被定义为一个int
文字 ,因此必须在由int
定义的范围内。
如果你想写一个long
文字,那么你必须通过附加L
(或小写l
来明确,但我强烈build议你总是使用大写变体,因为它更容易阅读和更难以误认为1
)。
请注意, float
(后缀F
/ f
)和double
(后缀D
/ d
)也会出现类似的问题。
注意:你会意识到没有byte
或short
文字,你仍然可以为byte
和short
variables赋值(通常是int
文字):由于第5.2节有关Assignment Converson的特殊规则,这是可能的:它们允许分配常量如果值在types范围内, 则将较大types的expression式转换为byte
, short
, char
或int
。
试试做9223372036854775807L