Twoje pytanie brzmi „Dlaczego Java nie obsługuje niepodpisanych znaków int”?
A moja odpowiedź na twoje pytanie brzmi: Java chce, aby wszystkie jej prymitywne typy: bajt , char , short , int i long były traktowane odpowiednio jako bajt , słowo , dword i qword , dokładnie tak jak w asemblerze, a operatorzy Java są podpisani operacje na wszystkich typach pierwotnych oprócz char , ale tylko na char są 16-bitowe bez znaku.
Zatem metody statyczne mają być również operacjami niepodpisanymi dla 32-bitowego i 64-bitowego.
Potrzebujesz klasy końcowej, której metody statyczne można wywołać dla niepodpisanego operacji .
Możesz stworzyć tę ostatnią klasę, nazwać ją dowolną nazwą i zaimplementować jej metody statyczne.
Jeśli nie masz pojęcia, jak zaimplementować metody statyczne, kliknij ten link może ci pomóc.
Moim zdaniem, Java jest nie podobny do C ++ w ogóle , gdyby nie wsparcie niepodpisanych typów ani przeciążanie operatorów, więc myślę, że Java powinny być traktowane jako całkowicie inny język zarówno z C ++ i od C.
Nawiasem mówiąc, jest to zupełnie inna nazwa języków.
Dlatego nie polecam w Javie wpisywania kodu podobnego do C i wcale nie polecam wpisywania kodu podobnego do C ++, ponieważ wtedy w Javie nie będziesz mógł robić tego, co chcesz zrobić w C ++, tzn. kod w dalszym ciągu nie będzie w ogóle C ++, a dla mnie źle jest tak kodować, aby zmienić styl w środku.
Zalecam pisanie i używanie metod statycznych również dla operacji podpisanych, więc nie widzisz w kodzie mieszanki operatorów i metod statycznych zarówno dla operacji podpisanych, jak i niepodpisanych, chyba że potrzebujesz tylko podpisanych operacji w kodzie, i jest w porządku używaj tylko operatorów.
Również polecam aby uniknąć stosując krótkie , int i długo prymitywnych typów i użyć słowa , dword i qword odpowiednio zamiast, a ty o wywołać metody statyczne dla operacji bez znaku i / lub podpisanych operacji zamiast używać operatorów.
Jeśli masz zamiar zrobić tylko podpisane operacji i korzystania z operatorów tylko w kodzie, to jest w porządku, aby korzystać z tych prymitywnych typów short , int i długi .
Właściwie słowo , DWORD i qword zrobić nie istnieje w języku, ale można utworzyć nową klasę dla każdego i realizacja każdego powinno być bardzo proste:
Słowo klasowe zawiera tylko typ pierwotny krótki , dword klasowy posiada typ pierwotny int tylko, a słowo klasy zawiera tylko typ pierwotny długi . Teraz wszystkie metody niepodpisane i podpisane jako statyczne lub nie do wyboru, możesz zaimplementować w każdej klasie, tj. Wszystkie 16-bitowe operacje zarówno niepodpisane, jak i podpisane przez podanie nazw znaczeń w klasie słów , wszystkie 32-bitowe operacje zarówno niepodpisane, jak i podpisane przez podanie nazw znaczeń w klasie dword i wszystkie operacje 64-bitowe zarówno niepodpisane, jak i podpisane przez podanie nazw znaczeń w klasie qword .
Jeśli nie lubisz nadawać zbyt wielu różnych nazw dla każdej metody, zawsze możesz użyć przeciążenia w Javie, dobrze jest przeczytać, że Java też tego nie usunęła!
Jeśli chcesz metod zamiast operatorów dla 8-bitowych operacji podpisanych i metod dla 8-bitowych operacji niepodpisanych, które w ogóle nie mają operatorów, możesz utworzyć klasę Byte (zwróć uwagę, że pierwsza litera „B” jest wielka, więc nie jest to bajt typu pierwotnego ) i zaimplementuj metody w tej klasie.
O przekazywaniu według wartości i przekazywaniu przez referencję:
Jeśli się nie mylę, jak w języku C #, obiekty prymitywne są przekazywane wartościowo naturalnie, ale obiekty klasy są przekazywane referencyjnie naturalnie, co oznacza, że obiekty typu Byte , word , dword i qword będą przekazywane przez referencję, a nie przez wartość domyślnie. Chciałbym, żeby Java miała obiekty struct tak jak C #, aby wszystkie Byte , word , dword i qword mogły być zaimplementowane w strukturze zamiast klasy, więc domyślnie były przekazywane przez wartość, a nie przez referencję domyślnie, jak każdy obiekt struct w C #, podobnie jak typy pierwotne, są przekazywane przez wartość, a nie przez referencję domyślnie, ale ponieważ Java jest gorsza niż C # i mamy aby sobie z tym poradzić, są tylko klasy i interfejsy, które są przekazywane przez referencję, a nie domyślnie przez wartość. Więc jeśli chcesz przekazać bajt , słowo , dword i qword obiektów przez wartość, a nie przez odniesienie, jak każdego innego obiektu klasy w Javie, a także w języku C #, trzeba będzie po prostu użyć konstruktora kopii i to wszystko.
To jedyne rozwiązanie, o którym mogę myśleć. Chciałbym tylko móc wpisać podstawowe typy słów, dwordów i qwordów, ale Java nie obsługuje ani typedef, ani w ogóle nie używa, w przeciwieństwie do C #, który obsługuje używanie , co jest równoważne typedef C.
O produkcji:
Dla tej samej sekwencji bitów możesz wydrukować je na wiele sposobów: jako binarne, jako dziesiętne (jak znaczenie% u w C printf), jako ósemkowe (jak znaczenie% o w C printf), jako szesnastkowe (jak znaczenie% x w C printf) i jako liczba całkowita (jak znaczenie% d w C printf).
Zauważ, że C printf nie zna typu zmiennych przekazywanych jako parametry do funkcji, więc printf zna typ każdej zmiennej tylko z obiektu char * przekazanego do pierwszego parametru funkcji.
Tak więc w każdej z klas: Bajt , słowo , dword i qword możesz zaimplementować metodę print i uzyskać funkcjonalność printf, mimo że pierwotny typ klasy jest podpisany, nadal możesz wydrukować go jako niepodpisany, postępując zgodnie z algorytmem obejmującym operacje logiczne i zmiany, aby uzyskać cyfry do wydrukowania na wyjściu.
Niestety podany przeze mnie link nie pokazuje, jak zaimplementować te metody drukowania, ale jestem pewien, że możesz znaleźć w Google algorytmy potrzebne do wdrożenia tych metod drukowania.
To wszystko, co mogę odpowiedzieć na twoje pytanie i zasugerować.