Xyz theo nghĩa đen của kiểu int nằm ngoài phạm vi


89

Hiện tại, tôi đang làm việc với các kiểu dữ liệu trong Java và nếu tôi hiểu chính xác thì kiểu này longchấp nhận một giá trị trong khoảng từ -9,223,372,036,854,775,808 đến +9,223,372,036,854,775,807. Bây giờ như bạn có thể thấy bên dưới, tôi đã tạo một longbiến được gọi là testLong, mặc dù khi tôi chèn 9223372036854775807 làm giá trị, tôi gặp lỗi cho biết:

9223372036854775807 theo nghĩa đen của kiểu int nằm ngoài phạm vi.

Tôi không biết tại sao nó lại đề cập đến longkiểu dữ liệu là một int.

Ai có ý tưởng gì không?

Mã:

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

Nhân tiện: bạn đang sử dụng trình biên dịch nào? Cả Eclipse và trình biên dịch Sun JDK đều đưa ra các thông báo lỗi khác nhau (theo ý kiến ​​của tôi là tốt hơn) cho sự cố này.
Joachim Sauer

Câu trả lời:


195

Thêm một vốn Lvào cuối:

long value = 9223372036854775807L;

Nếu không, trình biên dịch sẽ cố gắng phân tích cú pháp văn bản dưới dạng một int, do đó thông báo lỗi


4
Nó trong thông số kỹ thuật của ngôn ngữ Java. Tìm toàn văn ở đây
Lukas Eder

@Lukas, giá trị dài = 00000077029062100L; cho tôi cùng một lỗi và nó có ít hơn 19 chữ số. bất kỳ ý tưởng tại sao nó được ném "The 0000007702062100L đen của loại dài là ra khỏi phạm vi"
Santossh Kumhar

1
@SantosshKumhar: Đó là một chữ bát phân , không thể chứa chữ số 8hoặc 9. Loại bỏ các số 0 ở đầu.
Lukas Eder

49

Tôi không biết tại sao nó lại đề cập đến kiểu dữ liệu dài là int

Không phải vậy. Bạn nên học cách tin tưởng các thông điệp trình biên dịch (đặc biệt khi chúng đến từ các trình biên dịch lành mạnh, hiện đại chứ không phải trình biên dịch C / C ++ cổ xưa). Mặc dù đôi khi ngôn ngữ mà họ nói có thể khó giải mã, nhưng họ thường không nói dối bạn.

Hãy nhìn lại nó một lần nữa:

Nghĩa đen của int 9223372036854775807 nằm ngoài phạm vi.

Lưu ý rằng nó không đề cập đến biến testLonghoặc kiểu của bạn ở longbất kỳ đâu, vì vậy nó không liên quan đến việc khởi tạo. Vấn đề dường như xảy ra ở một số điểm khác.

Bây giờ, hãy điều tra một số phần của thông báo:

  • intcho chúng tôi biết rằng anh ấy muốn coi một thứ gì đó như một intgiá trị (đó không phải là điều bạn muốn!)
  • "ngoài phạm vi" là khá rõ ràng: một cái gì đó không nằm trong phạm vi mong đợi (có thể là int)
  • "Nghĩa đen": bây giờ thật thú vị: nghĩa đen là gì?

Tôi sẽ để danh sách ấm cúng để nói về các chữ trong giây lát: các chữ là những nơi bạn có một số giá trị trong mã của mình. Có nghĩa Stringđen, nghĩa intđen, nghĩa classđen và vân vân. Mỗi khi bạn đề cập rõ ràng đến một giá trị trong mã của mình, đó là một nghĩa đen.

Vì vậy, nó không thực sự khiến bạn khó chịu về khai báo biến, mà chính con số, giá trị mới là thứ khiến bạn khó chịu.

Bạn có thể dễ dàng xác minh điều này bằng cách sử dụng cùng một từ trong ngữ cảnh mà a longvà an intđều được chấp nhận như nhau:

System.out.println(9223372036854775807);

PrintStream.printlncó thể lấy mộtint hoặc mộtlong (hoặc khá nhiều thứ khác). Vì vậy, mã đó sẽ ổn, phải không?

Số Vâng, có lẽ nó nên được, nhưng theo các quy tắc đó không tốt.

Vấn đề là "một số chữ số" được xác định là một intchữ và do đó phải nằm trong phạm vi được xác định bởi int.

Nếu bạn muốn viết một longchữ, sau đó bạn phải chắc rằng rõ ràng bằng cách thêm các L(hoặc chữ thường l, nhưng tôi đánh giá cao đề nghị bạn luôn luôn sử dụng các biến thể chữ hoa, bởi vì nó dễ dàng hơn để đọc và khó khăn hơn để sai lầm trong một 1).

Lưu ý rằng sự cố tương tự xảy ra với float(postfix F/ f) và double(postfix D/ d).

Lưu ý bên cạnh: bạn sẽ nhận ra rằng không có bytehoặc không có shortchữ và bạn vẫn có thể gán giá trị (thường là intchữ) cho byteshortbiến: điều đó có thể xảy ra do các quy tắc đặc biệt trong § 5.2 về Chuyển đổi phép gán: chúng cho phép gán các biểu thức hằng có kiểu lớn hơn để byte, short, charhoặc int nếu các giá trị nằm trong các loại dao động.


3
Bạn dành thời gian từ đâu ;-)
Lukas Eder

3
@Lukas: Tôi thỉnh thoảng viết các câu trả lời như vậy với hy vọng rằng tôi sẽ không phải viết 300 câu ngắn hơn cho nó ;-) Ngoài ra: giúp giải thích thông báo lỗi (hy vọng) có nghĩa là ít câu hỏi "thông báo lỗi đó có nghĩa là gì".
Joachim Sauer

câu trả lời của bạn rất hay ... không nghi ngờ gì nữa, đó là lý do tại sao hãy bình chọn, nhưng hãy chỉnh sửa nó và ở trên cùng (bắt đầu câu trả lời của bạn), chỉ cần viết trong 1 dòng giải pháp chính xác cho vấn đề và sau đó là phần giải thích của bạn. Bởi vì rất nhiều người tìm kiếm giải pháp nhanh chóng hơn là lời giải thích sâu
Shirish Herwade

4
Họ có thể tự do xem các câu trả lời thứ hai khác (câu trả lời được bình chọn cao nhất thậm chí còn đưa ra giải pháp nhanh). Tôi nghĩ rằng giáo dục mọi người về cách phân tích cú pháp và hiểu thông báo lỗi về lâu dài sẽ hữu ích hơn là chỉ làm cho họ. "Cho một người đàn ông một con cá ..." và tất cả những điều đó.
Joachim Sauer

Cảm ơn cho lưu ý bên.
Venkatesh Goud

17

Hãy thử làm 9223372036854775807L. Phần Lcuối cho Java biết rằng đó 9223372036854775807là a long.


0

Tôi đã gặp vấn đề này trong quá khứ và tôi đã khắc phục điều đó bằng cách viết giá trị ở dạng khoa học. ví dụ:

double val = 9e300;

-2
long ak = 34778754226788444L/l;

Cả hai đều sử dụng nhưng tại một thời điểm chỉ có một sử dụng chữ hoa L hoặc chữ l viết thường.

Tại sao sử dụng L / l? Bởi vì long là một phần của kiểu dữ liệu tích phân.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.