2009-04-20 25 views
74

Có vẻ như khi bạn nhập một số vào Java, trình biên dịch sẽ tự động đọc nó dưới dạng số nguyên, đó là lý do tại sao khi bạn nhập (dài) 6000000000 (không nằm trong phạm vi của số nguyên), nó sẽ phàn nàn rằng 6000000000 không phải là số nguyên. Để sửa lỗi này, tôi phải chỉ định 6000000000L. Tôi vừa học về đặc điểm kỹ thuật này.Số đặc tả L (dài) của Java

Có các thông số kỹ thuật số khác như ngắn, byte, float, double không? Nó có vẻ như là sẽ tốt vì có (tôi giả sử) nếu bạn có thể chỉ định số bạn đang gõ là một đoạn ngắn sau đó java sẽ không phải bỏ nó - đó là một giả định, sửa tôi nếu tôi sai . Tôi thường tự mình tìm kiếm câu hỏi này, nhưng tôi không biết loại đặc tả số này thậm chí còn được gọi là gì.

Trả lời

143

Có hậu tố cụ thể cho long (ví dụ 39832L), float (ví dụ 2.4f) và double (ví dụ -7.832d).

Nếu không có hậu tố và đó là loại tích phân (ví dụ: 5623), được giả định là int. Nếu nó không phải là một loại tích phân (ví dụ: 3.14159), nó được giả định là double.

Trong tất cả các trường hợp khác (byte, short, char), bạn cần truyền vì không có hậu tố cụ thể.

Các spec Java cho phép cả trên và dưới trường hợp hậu tố, nhưng phiên bản chữ hoa cho long s được ưa thích, như trường hợp trên L ít dễ nhầm lẫn với một số 1 hơn chữ thường l.

Xem chi tiết số JLS section 3.10 để biết chi tiết đẫm máu (xem định nghĩa của IntegerTypeSuffix).

+7

entry muộn: loại bỏ các nguồn tiềm năng của sự mơ hồ luôn luôn là tốt, và * Tôi không đồng ý * ... nhưng tôi tin rằng nếu bạn thấy mình bối rối '1' với' l' và '0' với' O' (và vân vân), * ưu tiên * của bạn là đặt phông chữ đúng (nếu bạn có thể), sau đó lo lắng về việc đảm bảo bạn không bỏ lỡ phím Shift. – davidcesarino

+0

@SimonNickerson Tôi có câu hỏi về hậu tố ... Nếu tôi khai báo biến _long_ hoặc _double_ như: 'long _lo = 30;' và không '30L' có nghĩa là biến của tôi sẽ được chuyển thành _float_ không? Hoặc trong trường hợp '_lo = _lo + 2.77' mà' _lo' sẽ được đúc thành _float_ mặc dù nó được khai báo là _long_ – luigi7up

+0

Không, phao không được tham gia ở đây. Trong trường hợp đầu tiên, '30' là một' int' được tự động chuyển đổi thông qua một chuyển đổi mở rộng thành 'long'.Trong trường hợp thứ hai, tuyên bố của bạn là bất hợp pháp. Bạn sẽ phải đúc một cách rõ ràng phía bên tay phải, ví dụ: '_lo = (long) (_lo + 2.77)' –

0

xem xét:

long l = -1 >>> 1; 

so

int a = -1; 
long l = a >>> 1; 

Bây giờ bạn mong muốn làm phiền các đoạn mã để cung cấp cho các giá trị tương tự để biến l. Vì vậy, chúng tôi cần biểu hiện trên int literals được thực hiện dưới dạng int s.

8

Đây là các chữ cái và được mô tả trong section 3.10 của thông số ngôn ngữ Java.

12

tôi hy vọng bạn sẽ không nhớ một tiếp xúc nhỏ, nhưng nghĩ bạn có thể quan tâm để biết rằng bên cạnh F (đối với float), D (ví kép), và L (lâu), a proposal has been made thêm hậu tố cho byteshortYS tương ứng. Điều này sẽ loại bỏ sự cần thiết phải đúc thành các byte khi sử dụng cú pháp theo nghĩa đen cho các mảng byte (hoặc ngắn). Trích dẫn ví dụ từ đề xuất:

LỢI ÍCH CHỦ YẾU: Tại sao nền tảng tốt hơn nếu đề xuất được chấp nhận?

đang cruddy như

byte[] stuff = { 0x00, 0x7F, (byte)0x80, (byte)0xFF}; 

có thể được mã hóa lại như

byte[] ufum7 = { 0x00y, 0x7Fy, 0x80y, 0xFFy }; 

Joe Darcy được giám sát Dự án Coin cho Java 7, và his blog đã được một cách dễ dàng để theo dõi những đề nghị.

+0

sẽ đẹp ... Tôi luôn thấy rằng tất cả các phôi thực sự gây phiền nhiễu – jbu

+0

Tôi lấy nó không làm cho nó thành Java 7. Bất kỳ từ nào nếu nó sẽ biến nó thành bản cập nhật trong tương lai hoặc Java 8? – crush

+0

@crush Tôi đã thử nhìn vào nó một vài tháng trước, và theo như tôi có thể nói, đề nghị đã bị bỏ rơi. Chúng tôi đã nhận được _ trong số literals và tiền tố '0b' cho nhị phân mặc dù. Whoop. – erickson

1

Nó có vẻ như đây sẽ là tốt để có bởi vì (tôi giả sử) nếu bạn có thể ghi rõ số bạn đang gõ vào là một sau đó ngắn java sẽ không phải cast nó

Vì việc phân tích cú pháp các chữ được thực hiện tại thời gian biên dịch, điều này hoàn toàn không liên quan đến hiệu suất. Lý do duy nhất có các hậu tố shortbyte sẽ tốt đẹp là nó dẫn đến mã nhỏ gọn hơn.

3

Theo mặc định, mọi loại dữ liệu nguyên thủy không thể thiếu (byte, ngắn, int, dài) sẽ được coi là int loại bởi trình biên dịch java. Đối với bytengắn, miễn là giá trị được chỉ định cho chúng nằm trong phạm vi của chúng, không có vấn đề gì và không cần hậu tố. Nếu giá trị được gán cho bytengắn vượt quá phạm vi của chúng, yêu cầu nhập loại rõ ràng.

Ex:

byte b = 130; // CE: range is exceeding. 

để khắc phục điều này thực hiện loại đúc.

byte b = (byte)130; //valid, but chances of losing data is there. 

Trong trường hợp kiểu dữ liệu dài, nó có thể chấp nhận giá trị nguyên mà không gặp bất kỳ rắc rối nào. Giả sử chúng tôi chỉ định như

Long l = 2147483647; //which is max value of int 

trong trường hợp này không có hậu tố như L/l là bắt buộc. Theo mặc định, giá trị 2147483647 được xem xét bởi trình biên dịch java là kiểu int. Loại nội bộ đúc được thực hiện bởi trình biên dịch và int được tự động quảng bá loại Dài.

Long l = 2147483648; //CE: value is treated as int but out of range 

Ở đây chúng ta cần đặt hậu tố là L để xử lý văn bản 2147483648 theo kiểu dài bằng trình biên dịch java.

vì vậy cuối cùng

Long l = 2147483648L;// works fine. 
Các vấn đề liên quan