2009-11-10 36 views
10

Tôi đang thực hiện phân chia int rất đơn giản và tôi nhận được kết quả kỳ quặc.Phân chia int Java gây nhầm lẫn cho tôi

Mã này in 2 như mong đợi:

public static void main(String[] args) { 
    int i = 200; 
    int hundNum = i/100; 
    System.out.println(hundNum); 
} 

Mã này in 1 như không mong đợi:

public static void main(String[] args) { 
    int i = 0200; 
    int hundNum = i/100; 
    System.out.println(hundNum); 
} 

gì đang xảy ra ở đây?

(Windows XP Pro, Java 1.6 chạy trong Eclipse 3.4.1)

Trả lời

22

Giá trị 0200 là một bát phân (cơ sở 8) không đổi. Nó bằng 128 (thập phân).

Từ Section 3.10.1 of the Java Language Specification:

Một số bát phân bao gồm một ASCII chữ số 0 theo sau là một hoặc nhiều chữ số ASCII từ 0 đến 7 và có thể đại diện cho một số nguyên dương, bằng không, hay tiêu cực.

+2

Chà, tôi không thể tin rằng tôi chưa từng gặp phải điều này trước đây. Tôi cảm thấy như một thằng ngốc. Cảm ơn! – jjnguy

+2

Tôi nhìn vào điểm số đại diện của bạn và tôi mặc dù nó phải là một cái gì đó khác! – moogs

+8

Đây là một trong những tính năng khó chịu nhất của ngôn ngữ dựa trên C. Tôi chưa bao giờ thấy ai đó sử dụng một hằng số bát phân vào mục đích, nhưng tôi đã thấy nó gây ra nhiều vấn đề nhiều lần. –

6

Giá trị 0200 là bát phân, là bằng số thập phân.

Để biết thêm thông tin, hãy xem phần chữ của giải thích Primitive Data Types.

1

Quan sát một hành vi thú vị ở đây.

Nếu tôi làm Integer.parseInt("0200"), tôi nhận được 200 là o/p.

Howzzat?!

+2

Kiểm tra tài liệu API cho parseInt. Nó nói tất cả: public static int parseInt (String s) ... Phân tích đối số chuỗi dưới dạng số nguyên thập phân đã ký. Các ký tự trong chuỗi phải là số thập phân, ngoại trừ ký tự đầu tiên có thể là mã ASCII dấu trừ '-' ('\ u002D') để biểu thị giá trị âm. – sateesh

+1

parseInt phân tích cú pháp một chuỗi có băm 10. Một cuộc gọi đến Integer.decode phân tích từ 0200 đến 128. – Salandur

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