2008-11-25 21 views
53

Tôi có thể tạo chữ dài bằng cách gắn thêm L vào giá trị; tại sao tôi không thể tạo ra một chữ ngắn hoặc byte theo cách tương tự? Tại sao tôi cần sử dụng chữ in đậm với dàn diễn viên?Tại sao không có byte hoặc các chữ ngắn trong Java?

Và nếu câu trả lời là "Vì không có chữ viết tắt trong C", vậy tại sao không có các chữ viết tắt ngắn trong C?

Điều này thực sự không ảnh hưởng đến cuộc sống của tôi theo bất kỳ cách nào có ý nghĩa; thật dễ dàng để viết (viết tắt) 0 thay vì 0S hoặc gì đó. Nhưng sự mâu thuẫn khiến tôi tò mò; đó là một trong những điều khiến bạn bận tâm khi bạn thức khuya. Một người nào đó tại một số điểm đã đưa ra quyết định thiết kế để có thể nhập các chữ cái cho một số loại nguyên thủy, nhưng không phải cho tất cả chúng. Tại sao?

Trả lời

15

Trong C, int ít nhất có nghĩa là có kích thước từ "tự nhiên" của CPU và long có thể có nghĩa là kích thước từ "lớn hơn" (không chắc chắn trong phần cuối cùng). lý do tại sao intlong có cùng kích thước trên x86).

Bây giờ, tôi đoán là: đối với intlong, có một đại diện tự nhiên phù hợp chính xác với thanh ghi của máy. Tuy nhiên, trên hầu hết các CPU, các loại nhỏ hơn byteshort sẽ phải được đệm trước int trước khi sử dụng. Nếu đó là trường hợp, bạn cũng có thể có một diễn viên.

8

Tôi nghi ngờ đó là trường hợp "không thêm bất kỳ thứ gì vào ngôn ngữ trừ khi nó thực sự thêm giá trị" - và nó được xem là bổ sung đủ giá trị nhỏ để không đáng giá. Như bạn đã nói, thật dễ dàng để có được vòng, và thẳng thắn nó hiếm khi cần thiết anyway (chỉ cho định hướng).

Điều này cũng đúng trong C# và tôi chưa bao giờ bỏ lỡ nó ở cả hai ngôn ngữ. Những gì tôi bỏ lỡ trong Java là một loại byte không dấu :)

+4

có, xin vui lòng thêm byte unsigned :(. Đối với vấn đề trong tầm tay, tôi nghĩ rằng nó có giá trị đề cập đến có một iteral dài vì Một int intal không thể đại diện cho tất cả các giá trị của một dài.Nhưng một int có thể đại diện cho tất cả các giá trị của một ngắn trên mặt khác –

+0

Nhưng tôi nghĩ rằng nó thêm giá trị - không phải đúc có thể là một lợi thế lớn. ngắn) (val + 10) 'là chỉ gây phiền nhiễu mặc dù Java cũng sẽ phải cho phép bổ sung' short's cho rằng để làm việc. – mjaggard

+0

@mjaggard: Đó là vấn đề thêm * đủ giá trị nhỏ * để làm cho nó không có giá trị nó. Hơi khó chịu nhưng xa vấn đề lớn nhất ... –

5

Một lý do khác có thể là JVM không biết về ngắn và byte. Tất cả các tính toán và lưu trữ được thực hiện với ints, longs, float và double trong JVM.

+1

Được rồi, nhưng đó là sự thật của mọi JVM? Và ngay cả khi nó được, nên định nghĩa ngôn ngữ thực sự phụ thuộc vào chi tiết thực hiện của VM nó chạy trên? Không phải đó là cách khác xung quanh? –

+0

Đó là một phần của thông số JVM, do đó, có: JVM không có cách nào để biết loại giá trị mà nó xử lý thực sự là gì. (Ngoại trừ một số thao tác như truy cập mảng, trong đó có các opcodes riêng biệt tồn tại). –

+5

Lưu trữ * không phải * luôn luôn được thực hiện với ints vv Ví dụ rõ ràng là một mảng byte, mà chắc chắn được lưu trữ như là một mảng byte chứ không phải là ints. Xem thêm http://stackoverflow.com/questions/229886/size-of-a-byte-in-memory-java –

2

Có một số điều cần xem xét.

1) Như đã thảo luận ở trên, JVM không có khái niệm về byte hoặc loại ngắn. Nói chung, các loại này không được sử dụng trong tính toán ở cấp JVM; vì vậy người ta có thể nghĩ rằng sẽ ít sử dụng những chữ này.

2) Để khởi tạo biến byte và ngắn, nếu biểu thức int là hằng số và trong phạm vi cho phép của loại, nó sẽ được truyền hoàn toàn đến loại mục tiêu.

3) Một luôn có thể cast đen, cựu (viết tắt) 10

Các vấn đề liên quan