Xem: Conversions and promotions
Theo đó, int
của bạn được thăng long
và sau đó được đánh giá.
Tương tự như vậy, ví dụ: int
+ double
và phần còn lại của số nguyên thủy. I E.
System.out(1 + 2.0);// prints 3.0 a double
Đối với nhà điều hành bổ sung
Tôi cũng giống như vậy, nhưng tôi không có bất kỳ tham chiếu nào về nó.
Chế độ xem nhanh nguồn của trình biên dịch cho thấy chúng khác nhau.
Cụ thể iadd
cho int cộng và ladd
bổ sung dài:
Xem mẫu này mã:
$cat Addition.java
public class Addition {
public static void main(String [] args) {
int a = Integer.parseInt(args[0]);
long b = Long.parseLong(args[0]);
// int addition
int c = a + a;
// long addition
long d = a + b;
}
}
$javac Addition.java
$
Khi biên soạn mã byte được tạo ra là thế này:
$javap -c Addition
Compiled from "Addition.java"
public class Addition extends java.lang.Object{
public Addition();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: aload_0
1: iconst_0
2: aaload
3: invokestatic #2; //Method java/lang/Integer.parseInt:(Ljava/lang/String;)I
6: istore_1
7: aload_0
8: iconst_0
9: aaload
10: invokestatic #3; //Method java/lang/Long.parseLong:(Ljava/lang/String;)J
13: lstore_2
14: iload_1
15: iload_1
16: iadd
17: istore 4
19: iload_1
20: i2l
21: lload_2
22: ladd
23: lstore 5
25: return
}
Nhìn vào dòng 16
nó nói: iadd
(để thêm vào) trong khi dòng 22
nói ladd
(ví Ngoài dài)
Ngoài ra, nó là an toàn để thực hiện số học với nguyên thủy khác nhau, miễn là bạn đang gán vào một biến kiểu nguyên thủy rộng nhất trong biểu hiện của bạn?
Vâng, và nó cũng "an toàn" để thực hiện số học với kích thước nhỏ hơn, theo nghĩa, họ không phá vỡ các chương trình, bạn chỉ mất thông tin.
Ví dụ, hãy thử thêm Integer.MAX_VALUE để Integer.MAX_VALUE
để xem những gì sẽ xảy ra, hoặc int x = (int) (Long.MAX_VALUE - 1);
Đây không phải là diễn đàn, nó không thực sự minh bạch đối với những người đã trả lời câu hỏi của bạn rằng bạn đã theo dõi. Đối với chỉnh sửa của bạn mặc dù: Java sẽ không cho phép bạn gán kết quả của một hoạt động cho một biến nếu biến không phải là kiểu nguyên thủy "rộng" đủ để giữ nó.Nói cách khác, bạn không thể gán kết quả của "0L + 1" cho một int mà không cần phải đặc biệt đúc vào một int. –
Ah ok, điều đó có ý nghĩa. Cảm ơn đã theo lên. – BordrGuy108
Không hoàn toàn an toàn vì nhiều thao tác có thể dẫn đến tràn hoặc tràn. thử Long.MAX_VALUE + 1 Tuy nhiên, nó sẽ luôn biên dịch nếu bạn gán cho loại rộng nhất. –