2015-07-11 77 views
3

前導零我有以下代碼關於整數值

int a = 01111; 
System.out.println("output1 = " + a); 
System.out.println("output2 = " + Integer.toOctalString(1111)); 

和輸出是

output1 = 585 
output2 = 2127 

我期待輸出到像的下方。

output1 = 2127 
output2 = 2127 

爲什麼它給585當我打印直接int值?我期待Java自動將值從前導零轉換爲八進制。

01111585之間的關係是什麼?

+0

'585'是一個小數,'1111'是'585'的八進制等效物 – adatapost

回答

4

前導0表示八進制數(基數8)。

01111(八進制)爲1×8^3 + 1 * 8^2 + 1 * 8^1 + 1 * 8^0 = 585(十進制)

Integer.toOctalString(1111)十進制數1111轉換爲八進制串。 2127八進制(2 * 8^3 + 1 * 8^2 + 2 * 8^1 + 7 * 8^0)是1111十進制。

+0

這是OP所期待的而沒有得到的。問題是:爲什麼他沒有得到它?或者確切地說,爲什麼它與其他印刷聲明不同。 – amit

+0

@amit'當我打印直接的int值時,爲什麼它會給585?'暗示他得到了585,儘管他沒有想到它。 – Eran

+0

錯誤。這就是他正在得到,但不期待 – Klaster

3
System.out.println("output2 = " +Integer.toOctalString(1111)); 

是十進制字符串1111轉換爲八進制字符串:2127

八進制1111的十進制值是585 - 正如預期的那樣,結果是預期的,您沒有得到相同的值,因爲這兩個語句做了不同的事情。

正確的測試將是:

System.out.println("output2 = " +Integer.toOctalString(a)); 

,這將給你如市場預期,1111

0

如果有0一些文字開始就表示八進制基地。同樣,0x表示十六進制基數和0b的二進制數。

所以你

int a=01111; 

..其實是

8^3 + 8^2 + 8^1 + 8^0 = 
512 + 64 + 8 + 1 = 585 

Integer.toOctalString(1111))實際上是一個反向作用,即結果是八進制數是十進制1111,這2127真的是

2127(oct) = 2 × 8^3 + 1 × 8^2 + 2 × 8^1 + 7 × 8^0 = 1111(dec)