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 testLong
hoặc kiểu của bạn ở long
bấ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:
int
cho chúng tôi biết rằng anh ấy muốn coi một thứ gì đó như một int
giá 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 long
và an int
đều được chấp nhận như nhau:
System.out.println(9223372036854775807);
PrintStream.println
có 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 int
chữ 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 long
chữ, 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ó byte
hoặc không có short
chữ và bạn vẫn có thể gán giá trị (thường là int
chữ) cho byte
và short
biế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
, char
hoặc int
nếu các giá trị nằm trong các loại dao động.