2013-01-15 18 views
5

Możliwe zduplikowane:
char and int in JavaDlaczego możemy przypisać char do int w java?

AsicII tabeli: http://www.asciitable.com

Kod poniżej wydrukować wartości grudnia odpowiedniego odbarwiającego, na przykład "123" -> 49 50 51

public void foo(String str) 
     { 
      for(int x = 0; x < str.length(); x++) 
      { 
       int temp = str.charAt(x); 
       System.out.println(temp); 
      } 
     } 

Zauważam jednak, że java jest silnym językiem typu, co oznacza, że ​​każda rzecz musi być rzucona w czasie kompilacji, ale w jaki sposób kod będzie wiedział, jak i kiedy przekształcić char w poprawną wartość Dec w tabeli AsicII? Czy nie zepsuć żadnej z podstawowych funkcji java/programowania?

+0

To jest dobre pytanie; dziwne jest to, że Java pozwalałaby na automatyczne rzutowanie z znaków na int, biorąc pod uwagę jego predyspozycje do silnych typów. +1 – BlackVegetable

+3

Java umożliwia automatyczne rzutowanie z mniejszego do wyższego typu. Podnosi błąd kompilacji, jeśli próbujesz zrobić to w sposób implikowany na odwrót. – aldrinleal

+0

Czy możesz podać przykład, w którym możesz zrobić to przypadkowo i wprowadzić błąd? –

Odpowiedz

8

char jest po prostu unsigned liczba 16-bitowa, więc ponieważ w zasadzie podzbiór typu int, JVM może rzucić ją bez dwuznaczności.

+0

Hmm, ta logika sprawi, że myślisz, że możesz wykonać obsadę bez zmiany wartości reprezentacji ... w ten sposób "1" rzuciłoby "1", a nie 49 lub cokolwiek innego. – BlackVegetable

+0

Reprezentacja i wartość to nie to samo. Dwie rzeczy mogą mieć tę samą wartość (tj. 49), ale inną reprezentację "1" dla char i 49 dla int. Dunno, jeśli wprowadzę cię w błąd jeszcze bardziej ... przepraszam .. – mprivat

+0

Nie, masz rację. Użyłem złych warunków. Przypuszczam, że mógł rzucić to tak, jak to robi, albo musiałby zabronić wszystkich rzutów int-> char, ponieważ tylko 0-> 9 miałoby sens. – BlackVegetable

2

Java powstał w oparciu w C, i to cechę C: znaki reprezentują liczbę oraz

Jak skalarne, choć jest pewien haczyk: - drukowanie char przyniesie char ascii - drukowanie Int przyniesie numer

są też pewne szczegóły uskok oraz przygnębienia (int być przekształcony w char musi być wykonane bezpośrednio za, ponieważ pewne obcięcie udział)

przykład:

long a = 1L; // a real long 
long n = 5; // int, cast to long 
int x = n; // (will raise an error) 
int z = (int) n; // works fine 
2

char ma podwójną osobowość.

Jest to 16-bitowa liczba całkowita bez znaku liczbowego, która powoduje przypisanie do bardzo naturalnej operacji, polegającej na rozszerzeniu prymitywnej konwersji, jednej z konwersji, które kompilator wstawi w razie potrzeby bez konieczności wyraźnego rzutowania.

Jest to również sposób reprezentacji znaków dla operacji we/wy i ciągów.