Trong Khoa học dữ liệu, khi chúng ta nói về số nguyên, chúng ta đang đề cập đến một loại dữ liệu đại diện cho một số phạm vi số nguyên toán học. Chúng tôi biết rằng các số nguyên toán học không có giới hạn trên, nhưng đây có thể là vấn đề về kích thước bộ nhớ, buộc hầu hết mọi kiến trúc máy tính phải giới hạn loại dữ liệu này
Vì vậy, đó là câu hỏi chúng tôi đang cố gắng hỏi ngày hôm nay. “Giá trị số nguyên tối đa mà chúng ta có thể biểu diễn trên một máy nhất định là bao nhiêu?”
2. Giải thích vấn đề
À, không có câu trả lời duy nhất cho câu hỏi này vì t có nhiều yếu tố ảnh hưởng đến câu trả lời. Những cái chính là.
- bit nền tảng
- Ngôn ngữ được sử dụng
- Phiên bản đã ký hoặc chưa ký
Trong khoa học máy tính, cách biểu diễn số nguyên phổ biến nhất là theo một nhóm các chữ số nhị phân [bit], được lưu trữ dưới dạng hệ thống số nhị phân. Thứ tự của các byte bộ nhớ khác nhau – với bit, chúng ta có thể mã hóa số nguyên.
Chúng ta có thể thấy sự khác biệt trong ví dụ đơn giản này. với các bit , chúng ta có thể mã hóa các số nguyên từ thành hoặc từ thành .
Thông thường, kích thước số nguyên được xác định bởi cấu trúc máy, nhưng một số ngôn ngữ máy tính cũng xác định kích thước số nguyên một cách độc lập. Các CPU khác nhau hỗ trợ các loại dữ liệu khác nhau, dựa trên nền tảng riêng của chúng. Thông thường, tất cả đều hỗ trợ cả loại đã ký và chưa ký, nhưng chỉ có một bộ độ rộng giới hạn và cố định, thường là 8, 16, 32 và 64 bit.
Một số ngôn ngữ xác định hai hoặc nhiều loại kiểu dữ liệu số nguyên, một loại nhỏ hơn để tiết kiệm bộ nhớ và chiếm ít bộ nhớ hơn và loại lớn hơn để cải thiện phạm vi được hỗ trợ
Một điều khác cần lưu ý là Kích thước từ [còn gọi là Độ dài từ] của nền tảng
Trong khoa học máy tính, từ là đơn vị dữ liệu được sử dụng bởi một thiết kế bộ xử lý cụ thể, một phần dữ liệu có kích thước cố định được phần cứng của bộ xử lý xử lý dưới dạng một đơn vị. Khi nói về kích thước từ, chúng ta đề cập đến số lượngsố bit trong một từ và đây là một đặc điểm quan trọng của bất kỳ kiến trúc máy tính và thiết kế bộ xử lý cụ thể nào.
Các kiến trúc hiện tại thường có kích thước từ 64 bit, nhưng cũng có một số có 32 bit
3. Thời gian cho câu trả lời
Trong phần này, chúng tôi sẽ trả lời các câu hỏi của mình bắt đầu từ người bạn C cũ đến Python tương đối mới, đi qua Java thường xanh. Hãy bắt đầu
3. 1. C
Ngôn ngữ C được thiết kế vào năm 1972, với mục đích hoạt động giống nhau trên các loại máy khác nhau. Vì vậy, nó không xác định trực tiếp phạm vi cho kiểu dữ liệu số nguyên vì điều đó phụ thuộc vào kiến trúc máy
Tuy nhiên, C có hai loại số nguyên;
Một số nguyên ngắn ít nhất là 16 bit. Vì vậy, trên máy 16 bit, nó trùng với định dạng số nguyên dài. Định dạng số nguyên ngắn nằm trong khoảng từ -32,767 đến 32,767 đối với phiên bản đã ký và từ 0 đến 65,535 đối với phiên bản chưa ký. Chà, thật kỳ lạ, nhưng có vẻ như đối với phiên bản đã ký, chúng tôi bỏ lỡ một số. Điều đó thật dễ dàng để giải thích. bởi vì chúng ta cần một bit cho dấu hiệu
Nếu chúng tôi chạy trên hệ thống 64 bit, chúng tôi có thể dễ dàng tính toán rằng định dạng dài có thể đạt tới giá trị , tương ứng với 18.446.744.073.709.551.615 cho loại dữ liệu không dấu và nằm trong khoảng từ - .
Để hoàn thiện, chúng ta sẽ tìm hiểu một chút về kiểu dữ liệu số nguyên dài dài. Định dạng long long không có trên C mà chỉ có trên bản C99. Nó có gấp đôi dung lượng bộ nhớ của một kiểu dữ liệu dài, nhưng rõ ràng nó không được hỗ trợ bởi các trình biên dịch yêu cầu chuẩn C trước đó. Với kiểu dữ liệu long long, chúng tôi có thể đạt được rất lớn nếu chúng tôi đang chạy nó trên máy 32 bit trở lên.
3. 2. Java
Nói về Java, chúng ta phải nhớ rằng nó hoạt động thông qua một máy ảo. Điều đó cứu chúng tôi khỏi tất cả các biến được giải thích cho ngôn ngữ C
Java chỉ hỗ trợ các phiên bản số nguyên đã ký. họ đang
- byte [8 bit]
- ngắn [16 bit]
- int [32 bit]
- dài [64 bit]
Vì vậy, với định dạng số nguyên dài, chúng tôi có thể đạt được như với C trên máy 64 bit, nhưng lần này, trên mọi kiến trúc máy.
Tuy nhiên, với một số thao tác bit, chúng ta có thể nhận được các phiên bản không dấu, nhờ định dạng char. Đó là định dạng 16-bit nên định dạng số nguyên không dấu có thể lên tới 65,535
Nhưng với Java, chúng ta có thể tiến xa hơn với một mẹo nhỏ để có thể biểu diễn các số nguyên rất lớn thông qua thư viện lớp BigInteger. Thư viện này kết hợp các mảng biến nhỏ hơn để tạo nên những con số khổng lồ. Giới hạn duy nhất là bộ nhớ vật lý, vì vậy chúng ta có thể biểu diễn một phạm vi số nguyên khổng lồ nhưng vẫn bị giới hạn
Ví dụ: với 1 kilobyte bộ nhớ, chúng ta có thể truy cập số nguyên dài tới 2.466 chữ số
3. 3. con trăn
Python trực tiếp hỗ trợ các số nguyên chính xác tùy ý, còn được gọi là số nguyên chính xác vô hạn hoặc bignum, dưới dạng cấu trúc cấp cao nhất
Điều này có nghĩa là, như với Java BigInteger, chúng tôi sử dụng nhiều bộ nhớ nhất có thể cho một số nguyên lớn tùy ý. Vì vậy, về mặt ngôn ngữ lập trình, câu hỏi này hoàn toàn không áp dụng cho Python, vì kiểu số nguyên đơn giản, về mặt lý thuyết là không giới hạn
Điều không bị giới hạn là kích thước từ của trình thông dịch hiện tại, giống như kích thước từ của máy trong hầu hết các trường hợp. Thông tin đó có sẵn trong Python dưới dạng sys. maxsize và đó là kích thước của danh sách hoặc chuỗi trong bộ nhớ lớn nhất có thể, tương ứng với giá trị tối đa có thể biểu thị bằng một từ đã ký
Trên máy 64-bit, nó tương ứng với = 9.223.372.036.854.775.807.
4. Sơ đồ
Chúng ta hãy xem một sơ đồ để tóm tắt những gì chúng ta đã thấy cho đến nay
5. Mã thực cho từng ngôn ngữ
Đây là một số mã thực để kiểm tra trực tiếp những gì chúng ta đã thảo luận cho đến nay. Mã này sẽ thể hiện giá trị lớn nhất và nhỏ nhất của số nguyên trong mỗi ngôn ngữ
Vì những giá trị đó không tồn tại trên Python, mã này cho biết cách hiển thị kích thước từ của trình thông dịch hiện tại
5. 1. Mã C
#include
int main[] {
printf["%d\n", INT_MAX];
printf["%d", INT_MIN];
return 0;
}
5. 2. Mã Java
public class Test {
public static void main[String[] args] {
System.out.println[Integer.MIN_VALUE];
System.out.println[Integer.MAX_VALUE];
}
}
5. 3. Mã Python
import platform
platform.architecture[]
import sys
sys.maxsize
6. Phần kết luận
Trong bài viết này, chúng tôi đã đề cập đến sự khác biệt giữa ba ngôn ngữ hàng đầu này về số nguyên tối đa có thể. Chúng tôi cũng đã chỉ ra cách câu hỏi này không áp dụng trong một số trường hợp
Tuy nhiên, người ta phải luôn sử dụng phù hợp nhất trong tình huống của mình để tránh tiêu thụ bộ nhớ và lag hệ thống
tác giả dưới cùng
Nếu bạn có một vài năm kinh nghiệm trong Khoa học máy tính hoặc nghiên cứu và bạn muốn chia sẻ kinh nghiệm đó với cộng đồng, hãy xem Nguyên tắc đóng góp của chúng tôi