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 đó là 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 bytevà shortbiế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.