Tất cả đều xuất phát từ phần cứng.
Một byte là đơn vị bộ nhớ có địa chỉ nhỏ nhất trên hầu hết các phần cứng.
Mỗi loại bạn vừa đề cập được xây dựng từ một số nhiều byte.
Một byte là 8 bit. Với điều đó, bạn có thể thể hiện 8 booleans nhưng bạn không thể tìm kiếm từng cái một. Bạn địa chỉ 1, bạn đang giải quyết tất cả 8.
Và nó đã từng đơn giản như vậy nhưng sau đó chúng tôi đã đi từ một chiếc xe buýt 8 bit đến một chiếc xe buýt 16, 32 và bây giờ là 64 bit.
Điều đó có nghĩa là trong khi chúng ta vẫn có thể giải quyết ở mức byte, chúng ta không thể truy xuất một byte từ bộ nhớ nữa mà không nhận được các byte lân cận.
Đối mặt với phần cứng này, các nhà thiết kế ngôn ngữ đã chọn cho phép chúng tôi chọn các loại cho phép chúng tôi chọn các loại phù hợp với phần cứng.
Bạn có thể tuyên bố rằng một chi tiết như vậy có thể và nên được trừu tượng hóa đặc biệt là trong một ngôn ngữ nhằm chạy trên bất kỳ phần cứng nào. Điều này sẽ có những lo ngại về hiệu suất nhưng bạn có thể đúng. Nó đã không xảy ra theo cách đó.
Java thực sự cố gắng để làm điều này. Byte được tự động thăng cấp lên Ints. Một thực tế sẽ khiến bạn phát điên khi lần đầu tiên bạn cố gắng thực hiện bất kỳ công việc chuyển bit nghiêm trọng nào trong đó.
Vậy tại sao nó không hoạt động tốt?
Điểm bán hàng lớn của Java trở lại theo cách mà bạn có thể ngồi xuống với một thuật toán C tốt đã biết, nhập nó vào Java và với các điều chỉnh nhỏ, nó sẽ hoạt động. Và C rất gần với phần cứng.
Giữ kích thước đi và trừu tượng hóa ra khỏi các loại tích phân chỉ không hoạt động cùng nhau.
Vì vậy, họ có thể có. Họ chỉ không làm thế.
Có lẽ lập trình viên sẽ không muốn ai đó có thể sử dụng một số lượng lớn hơn một kích thước nhất định và điều này cho phép họ giới hạn nó.
Đây là suy nghĩ hợp lệ. Có những phương pháp để làm điều này. Các chức năng kẹp cho một. Một ngôn ngữ có thể đi xa đến mức nướng các giới hạn tùy ý vào các loại của chúng. Và khi các giới hạn đó được biết tại thời điểm biên dịch sẽ cho phép tối ưu hóa trong cách các số đó được lưu trữ.
Java không phải là ngôn ngữ đó.