- 1 1. Giá trị tối đa của kiểu long trong Java là gì?
- 2 2. Cách lấy giá trị tối đa của long trong Java
- 3 3. Điều Gì Xảy Ra Khi một long Vượt Quá Giá Trị Tối Đa? (Overflow)
- 4 4. So Sánh Giá Trị Tối Đa với Các Kiểu Số Nguyên Khác
- 5 5. Các Kịch Bản Thực Tế Để Xử Lý Giá Trị Tối Đa Của long
- 6 6. Các Quan Niệm Sai Lầm Phổ Biến Về Giá Trị Tối Đa Của long
- 7 7. Summary (Quick Review)
- 8 FAQ
- 8.1 Q1. What is the maximum value of Java’s long?
- 8.2 Q2. How many bits is a long?
- 8.3 Q3. What happens if you exceed Long.MAX_VALUE?
- 8.4 Q4. Does Java have unsigned long?
- 8.5 Q5. Is there a safe way to calculate the maximum value?
- 8.6 Q6. Tôi nên dùng int hay long?
- 8.7 Q7. Long có thể chứa bao nhiêu chữ số?
- 8.8 Q8. Sự khác nhau giữa long và BigInteger là gì?
1. Giá trị tối đa của kiểu long trong Java là gì?
Giá trị tối đa của Java’s long type là 9223372036854775807.
Nó được định nghĩa là hằng số Long.MAX_VALUE.
Đầu tiên, hãy xác nhận kết luận.
public class Main {
public static void main(String[] args) {
System.out.println(Long.MAX_VALUE);
}
}
Kết quả:
9223372036854775807
Nói cách khác, đây là giá trị dương lớn nhất mà bạn có thể lưu trữ trong một Java long.
1.1 Giá trị tối đa của long là “9223372036854775807”
Giá trị này có thể được biểu diễn bằng công thức sau:
2^63 - 1
Điểm then chốt là tại sao nó là “63”.
longlà một số nguyên 64-bit.- 1 bit được dùng cho dấu (dương/âm).
- 63 bit còn lại đại diện cho giá trị số.
Do đó,
maximum value = 2^63 - 1
trở thành giá trị tối đa.
*Một “bit” là đơn vị dữ liệu nhỏ nhất đại diện cho 0 hoặc 1.
1.2 Tại sao nó không phải là 2^64 − 1 mặc dù là 64-bit?
Đây là điểm gây nhầm lẫn cho người mới bắt đầu nhất.
Java’s long is a signed integer.
“Signed” means it can represent both positive and negative values.
Phân tích 64 bits:
- 1 bit → dấu
- 63 bit → giá trị
Vì vậy, giá trị dương lớn nhất là:
2^63 - 1
Đó là lý do.
“2^64 – 1” áp dụng cho một unsigned integer.
Java không có một unsigned long type.
⚠ Hiểu lầm phổ biến
- × Giá trị tối đa của long là 18446744073709551615
- ○ Đúng: 9223372036854775807
1.3 Cũng kiểm tra giá trị tối thiểu của long
Giá trị tối thiểu là một mục cần biết khác để ghi nhớ cùng với giá trị tối đa.
System.out.println(Long.MIN_VALUE);
Kết quả:
-9223372036854775808
Dưới dạng công thức:
-2^63
Giá trị tuyệt đối lớn hơn 1 so với giá trị tối đa vì Java quản lý các số nguyên bằng two’s complement.
*Two’s complement is the standard mechanism computers use to represent negative numbers.
Những bẫy thường gặp và lưu ý
- Nhầm lẫn nó với
2^64-1 - Giả sử tồn tại một long không dấu
- Cố gắng ghi nhớ giá trị trực tiếp và nhầm số chữ số
- Nhầm lẫn với int (32-bit)
Đặc biệt, nhầm lẫn nó với giá trị tối đa của int (2147483647) là rất phổ biến.
2. Cách lấy giá trị tối đa của long trong Java
Khi làm việc với giá trị tối đa của long, quy tắc là: không viết trực tiếp số đó—sử dụng hằng số.
Ở đây chúng tôi sẽ giải thích các cách an toàn và thực tế để lấy nó.
2.1 Sử dụng Long.MAX_VALUE (Đề xuất)
Trong Java, giá trị tối đa được định nghĩa trong lớp java.lang.Long.
long max = Long.MAX_VALUE;
System.out.println(max);
Kết quả:
9223372036854775807
Tại sao bạn nên sử dụng hằng số?
- Ngăn ngừa lỗi chữ số/typo
- Cải thiện khả năng đọc
- Làm cho kiểu dữ liệu rõ ràng
- Độ bền cao hơn với các thay đổi trong tương lai (các thay đổi đặc tả là hiếm, nhưng an toàn hơn)
Không cần import đặc biệt nào.
Gói java.lang được tự động import.
2.2 Lưu ý khi viết số trực tiếp
Bạn cũng có thể viết giá trị tối đa trực tiếp.
long max = 9223372036854775807L;
Phần quan trọng ở đây là chữ “L” ở cuối.
Tại sao cần “L”?
Trong Java, một integer literal (a numeric literal) is treated as an int by default if nothing is appended.
Điều đó có nghĩa là:
long max = 9223372036854775807; // Error
Điều này gây ra lỗi biên dịch.
Lý do:
- Nó vượt quá phạm vi của int
- Nó không chỉ rõ rằng nó là một long
Đúng:
long max = 9223372036854775807L;
⚠ Chữ l viết thường khó phân biệt với chữ số 1, vì vậy khuyến nghị dùng chữ L viết hoa.
2.3 Rủi ro của việc hardcode
“Hardcoding” có nghĩa là viết giá trị số trực tiếp.
Ví dụ:
if (value == 9223372036854775807L) {
// Processing
}
Vấn đề:
- Ý nghĩa không rõ ràng
- Khó bảo trì
- Khó cho các nhà phát triển khác hiểu
Khuyến nghị:
if (value == Long.MAX_VALUE) {
// Processing
}
Điều này làm cho ý định của mã rõ ràng.
Những Sai Lầm Thông Thường
- Quên thêm
Lvà gặp lỗi biên dịch - Cố gắng gán nó vào một biến
int - Viết
Long max = Long.MAX_VALUE;mà không xem xét khả năng xử lý null (khi sử dụng các lớp wrapper) - Cố gắng tính nó bằng
Math.pow(2,63)(trở thành double và gây ra vấn đề về độ chính xác)
*Math.pow() trả về một double, vì vậy nó không phù hợp cho các phép tính số nguyên chính xác.
3. Điều Gì Xảy Ra Khi một long Vượt Quá Giá Trị Tối Đa? (Overflow)
long chỉ có thể xử lý một phạm vi hữu hạn.
Vì vậy nếu bạn vượt quá giá trị tối đa, nó không ném ra lỗi—giá trị của nó sẽ vòng lại (quay vòng).
Điều này được gọi là “tràn”.
3.1 Một Ví Dụ Thực Tế Về Tràn
Hãy kiểm chứng nó trong thực tế.
public class Main {
public static void main(String[] args) {
long max = Long.MAX_VALUE;
long overflow = max + 1;
System.out.println("Max value: " + max);
System.out.println("Max value + 1: " + overflow);
}
}
Kết quả:
Max value: 9223372036854775807
Max value + 1: -9223372036854775808
Bạn có thể thấy rằng max + 1 trở thành giá trị tối thiểu.
Điều này không phải là bất thường—đó là hành vi được định nghĩa bởi đặc tả Java.
3.2 Tại Sao Nó Không Trở Thành Lỗi?
Các kiểu số nguyên Java (int / long) không ném ra ngoại lệ khi giá trị vượt quá phạm vi.
Lý do:
- Số bit cố định (long là 64-bit)
- Giá trị vòng lại do biểu diễn bù hai
Về mặt khái niệm:
Max value → +1 → Min value
Min value → -1 → Max value
Máy tính chỉ tính toán các bit, vì vậy nó không có khái niệm “ngoài phạm vi”.
⚠ Sự nhầm lẫn thường gặp của người mới
- Giả định “sẽ có lỗi”
- Dấu hiệu đột ngột đổi và trở thành lỗi
3.3 Cách Phát Hiện Tràn
Bạn không thể phát hiện nó bằng phép cộng thông thường.
Phương Pháp 1: Sử dụng Math.addExact() (Đề xuất)
try {
long result = Math.addExact(Long.MAX_VALUE, 1);
} catch (ArithmeticException e) {
System.out.println("Overflow occurred");
}
Math.addExact() ném ra một ArithmeticException khi kết quả vượt quá phạm vi.
Cũng có:
Math.subtractExact()Math.multiplyExact()
cũng vậy.
3.4 Cách Thực Hiện Kiểm Tra Phạm Vi
Bạn cũng có thể kiểm tra trước khi cộng.
if (value > Long.MAX_VALUE - addValue) {
System.out.println("Adding will overflow");
}
*Trong thực tế, addExact() thường an toàn hơn so với cách tiếp cận này.
3.5 Sử Dụng BigInteger (Không Giới Hạn Trên)
Nếu long không đủ, hãy sử dụng BigInteger.
import java.math.BigInteger;
BigInteger a = new BigInteger("9223372036854775807");
BigInteger b = BigInteger.ONE;
BigInteger result = a.add(b);
System.out.println(result);
BigInteger không có giới hạn chữ số.
Nhưng lưu ý:
- Chậm hơn so với long
- Sử dụng nhiều bộ nhớ hơn
- Không phải là kiểu nguyên thủy (đó là kiểu đối tượng)
Những Sai Lầm Thông Thường và Ghi Chú
- Sử dụng long cho các phép tính tiền tệ và không nhận ra tràn
- Tạo ID mà không xem xét giới hạn trên
- Sử dụng Math.pow và gây ra lỗi độ chính xác
- Chuyển đổi sang double và lại (mất độ chính xác)
Điều này có thể trở thành một lỗi nghiêm trọng, đặc biệt trong xử lý tài chính.
4. So Sánh Giá Trị Tối Đa với Các Kiểu Số Nguyên Khác
Để hiểu đúng giá trị tối đa của long, bạn cũng nên sắp xếp cách nó khác biệt so với các kiểu số nguyên khác.
Trong Java, mỗi kiểu số nguyên có một phạm vi được định nghĩa rõ ràng dựa trên độ rộng bit của nó.
4.1 Sự Khác Biệt so với int
int là một số nguyên có dấu 32-bit.
System.out.println(Integer.MAX_VALUE);
Kết quả:
2147483647
So sánh:
| Type | Bit width | Maximum value |
|---|---|---|
| int | 32-bit | 2,147,483,647 |
| long | 64-bit | 9,223,372,036,854,775,807 |
Một long có thể xử lý một phạm vi lớn hơn khoảng 4,3 tỷ lần so với một int.
⚠ Những sai lầm thường gặp
- Giả định int là đủ và sau đó gây tràn do tăng trưởng
- Ánh xạ một BIGINT trong cơ sở dữ liệu sang int
4.2 So sánh với short và byte
Hãy cũng kiểm tra các kiểu số nguyên nhỏ hơn.
System.out.println(Short.MAX_VALUE); // 32767
System.out.println(Byte.MAX_VALUE); // 127
| Type | Bit width | Maximum value |
|---|---|---|
| byte | 8-bit | 127 |
| short | 16-bit | 32767 |
| int | 32-bit | 2147483647 |
| long | 64-bit | 9223372036854775807 |
Các trường hợp sử dụng điển hình:
- byte → các trường hợp sử dụng nén dữ liệu
- short → các giá trị số quy mô nhỏ
- int → xử lý số nguyên điển hình
- long → ID lớn và dấu thời gian
4.3 Khi Nào Bạn Nên Sử Dụng long?
Các trường hợp điển hình nơi bạn sử dụng long:
- Dấu thời gian UNIX (milliseconds)
- Cột BIGINT trong cơ sở dữ liệu
- ID tuần tự lớn
- Kích thước tệp (bytes)
Ví dụ:
long timestamp = System.currentTimeMillis();
System.currentTimeMillis() trả về một long.
Điều này là vì các giá trị cấp mili giây không vừa trong một int.
4.4 Rủi Ro Của Việc Sử Dụng long Không Cần Thiết
Một long sử dụng 8 bytes.
Một int sử dụng 4 bytes.
Khi xử lý lượng dữ liệu lớn:
- Sử dụng bộ nhớ tăng
- Hiệu quả bộ đệm giảm
- Tác động hiệu suất (phụ thuộc vào môi trường)
Do đó,
Nếu phạm vi rõ ràng vừa trong int, sử dụng int.
là nguyên tắc cơ bản.
Các Lỗi Phổ Biến Và Ghi Chú
- DB là BIGINT nhưng Java sử dụng int
- Nhận giá trị số JSON dưới dạng int mặc dù chúng giả định long
- Mất độ chính xác do ép kiểu ngầm trong chuyển đổi kiểu
- Gán kết quả Math.pow trực tiếp vào long
Lỗi do không khớp kiểu đặc biệt phổ biến trong tích hợp API.
5. Các Kịch Bản Thực Tế Để Xử Lý Giá Trị Tối Đa Của long
Giá trị tối đa của long không chỉ là kiến thức lý thuyết—nó quan trọng trong phát triển thực tế.
Hiểu nó là thiết yếu, đặc biệt trong các quy trình nơi tràn số có thể trở nên chết người.
5.1 Dấu Thời Gian UNIX
Khi lấy thời gian hiện tại trong Java:
long now = System.currentTimeMillis();
System.out.println(now);
System.currentTimeMillis() trả về số mili giây kể từ ngày 1 tháng 1 năm 1970.
Nếu bạn lưu nó trong một int:
int now = (int) System.currentTimeMillis(); // Dangerous
Giá trị bị hỏng (chỉ giữ lại 32 bit thấp).
⚠ Ghi Chú
- Cắt bớt do ép kiểu
- Vấn đề Năm 2038 (giới hạn của dấu thời gian dựa trên int)
- Nhầm lẫn giây với mili giây
Sử dụng long tránh được vấn đề Năm 2038.

5.2 Tích Hợp Với Cơ Sở Dữ Liệu (BIGINT)
Trong nhiều cơ sở dữ liệu, BIGINT là số nguyên 64 bit.
Ví dụ:
CREATE TABLE users (
id BIGINT PRIMARY KEY
);
Ở phía Java:
long id;
Nếu bạn nhận nó dưới dạng int:
- Hỏng dữ liệu
- Ngoại lệ khi đạt giới hạn trên
- Không có khả năng mở rộng tương lai
⚠ Các lỗi phổ biến trong thực tế
- int đủ ở đầu → thiếu chữ số sau
- Ánh xạ kiểu không đúng trong ORM
- Vấn đề độ chính xác số trong chuyển đổi JSON (JavaScript chỉ an toàn đến 53 bit)
5.3 Tạo ID Và Giới Hạn Trên
ID phân tán (ví dụ: ID kiểu Snowflake) thường sử dụng long.
Ví dụ:
long id = generateId();
Lý do:
- Không gian 64 bit đủ lớn
- Chuỗi, dấu thời gian, và ID máy có thể được chia thành bit
Tuy nhiên, về lý thuyết, long cũng có giới hạn trên.
Ví dụ kiểm tra:
if (currentId == Long.MAX_VALUE) {
throw new IllegalStateException("ID upper limit reached");
}
Trong thực tế, điều này hiếm khi đạt được, nhưng nên xem xét trong thiết kế hệ thống.
5.4 Tính Toán Kích Thước Tệp
Lấy kích thước tệp:
File file = new File("example.txt");
long size = file.length();
Đối với tệp lớn, int không đủ.
⚠ Ghi Chú
- Không chuyển đổi long sang int
- Chỉ số mảng là int (đây là nơi giới hạn xảy ra)
Các Lỗi Phổ Biến Trong Thực Tế
- Mất độ chính xác trong JavaScript khi xử lý long trong JSON
- Không cập nhật mã Java khi thay đổi kiểu cột DB
- Sử dụng long cho tính toán tiền tệ và gây tràn
- Thiết kế ID bền vững mà không xem xét giới hạn trên
6. Các Quan Niệm Sai Lầm Phổ Biến Về Giá Trị Tối Đa Của long
The maximum value of long is a topic with many misunderstandings in search results.
Here we organize the most confusing points.
6.1 There Is No unsigned long in Java
This is especially confusing for developers with C/C++ experience.
Java does not have:
an unsigned long type
A long is always a 64-bit signed integer.
Therefore, the maximum positive value is:
2^63 - 1
That’s the limit.
Since Java 8, the following methods were added:
Long.compareUnsigned(a, b);
Long.divideUnsigned(a, b);
However, these are helper methods for unsigned operations—there is still no unsigned long type.
6.2 The Maximum Value Is Not 2^64 − 1
Misinformation often found online:
18446744073709551615
This is the maximum value of an unsigned 64-bit integer.
Since Java’s long is signed:
The maximum value is 9223372036854775807
That’s the correct value.
Summary of the difference:
| Type | Maximum value |
|---|---|
| Signed 64-bit | 2^63 – 1 |
| Unsigned 64-bit | 2^64 – 1 |
Java uses the former.
6.3 BigInteger and long Are Different
BigInteger represents integers with virtually no upper limit.
Difference:
| Type | Upper limit | Nature |
|---|---|---|
| long | Fixed 64-bit | Primitive type |
| BigInteger | Virtually unlimited | Object type |
BigInteger:
- Uses more memory
- Slower calculations
- Requires equals() for comparison
long:
- Fast
- Lightweight
- Fixed range
Choose according to your use case.
6.4 It’s Dangerous to Calculate the Maximum with Math.pow
Incorrect example:
long max = (long) Math.pow(2, 63) - 1;
Problems:
- Math.pow returns a double
- double has 53-bit precision
- Precision errors occur for large integers
Correct approach:
long max = Long.MAX_VALUE;
Summary of Common Confusions
- Thinking unsigned long exists
- Mistaking it for 2^64 – 1
- Trying to calculate it with Math.pow
- Destroying precision via double conversion
- Confusing BigInteger with long
7. Summary (Quick Review)
Here is a concise summary of the key points you need in practice.
7.1 Final Answer: long Maximum Value
- Maximum value: 9223372036854775807
- Constant: Long.MAX_VALUE
- Formula: 2^63 – 1
- Type: 64-bit signed integer
Verification code:
System.out.println(Long.MAX_VALUE);
7.2 Essential Rules You Must Follow
- Do not hardcode the numeric maximum—use
Long.MAX_VALUE - Add
Lwhen writing a long literal - Do not confuse it with int
- Overflow does not throw an exception automatically
7.3 How to Prevent Overflow
To add safely:
Math.addExact(a, b);
If the value may exceed the limit:
- Use BigInteger
- Implement range checks
7.4 Important Points in Practice
- Receive DB BIGINT values as long
- Use long for UNIX timestamps
- Be careful with precision in JSON integrations
- Consider upper limits when designing ID systems
7.5 Most Important Checklist
- Are you mistakenly using 2^64 – 1?
- Do you assume unsigned long exists?
- Are you calculating it with Math.pow?
- Are you casting long to int?
- Do you understand what happens on overflow?
The maximum value of long is not just something to memorize—it is a core concept that affects your understanding of integer types as a whole.
FAQ
Q1. What is the maximum value of Java’s long?
9223372036854775807.
You can retrieve it with Long.MAX_VALUE.
Q2. How many bits is a long?
It is a 64-bit signed integer.
1 bit is for the sign, and the remaining 63 bits represent the value.
Q3. What happens if you exceed Long.MAX_VALUE?
No error occurs.
It wraps around to the minimum value (-9223372036854775808).
System.out.println(Long.MAX_VALUE + 1);
Q4. Does Java have unsigned long?
No, not as a type.
Java 8 and later provide helper methods for unsigned operations, but the type itself is always signed.
Q5. Is there a safe way to calculate the maximum value?
Do not calculate it directly. Always use:
Long.MAX_VALUE
Math.pow() trả về kiểu double và do đó không chính xác cho các số nguyên lớn.
Q6. Tôi nên dùng int hay long?
- Nếu phạm vi nằm trong khoảng khoảng 2,1 tỷ → dùng int
- Nếu có thể vượt quá → dùng long
Dùng long cho các cột DB BIGINT và dấu thời gian.
Q7. Long có thể chứa bao nhiêu chữ số?
Giá trị tối đa có 19 chữ số:
9223372036854775807
Q8. Sự khác nhau giữa long và BigInteger là gì?
- long → cố định 64-bit, nhanh
- BigInteger → gần như không giới hạn, chậm hơn
Nếu phạm vi vừa trong long, việc sử dụng long là cách tiếp cận tiêu chuẩn.


