Votre question est "Pourquoi Java ne prend-il pas en charge les entrées non signées"?
Et ma réponse à votre question est que Java veut que tous ses types primitifs: octet , char , short , int et long soient traités comme octet , mot , dword et qword , exactement comme dans l'assemblage, et les opérateurs Java sont signés opérations sur tous ses types primitifs à l'exception de char , mais uniquement sur char elles ne sont signées que sur 16 bits.
Ainsi , les méthodes statiques supposés être les non signés opérations aussi aux 32 et 64 bits.
Vous avez besoin de la classe finale, dont les méthodes statiques peuvent être appelées pour le unsigned opérations .
Vous pouvez créer cette classe finale, l'appeler comme vous voulez et implémenter ses méthodes statiques.
Si vous ne savez pas comment implémenter les méthodes statiques, alors ce lien peut vous aider.
À mon avis, Java est pas similaire à C ++ du tout , si elle ne supporte les types non signés , ni surcharge d'opérateur, donc je pense que Java doit être traité comme tout autre langage à la fois C ++ et de C.
Soit dit en passant, c'est complètement différent dans le nom des langues.
Donc, je ne recommande pas en Java de taper du code similaire à C et je ne recommande pas du tout de taper du code similaire à C ++, car en Java, vous ne pourrez pas faire ce que vous voulez faire ensuite en C ++, c'est-à-dire que le code ne continuera pas du tout à être en C ++ et pour moi, c'est mauvais de coder comme ça, de changer le style au milieu.
Je recommande d'écrire et d'utiliser des méthodes statiques également pour les opérations signées, de sorte que vous ne voyez pas dans le mélange de code des opérateurs et des méthodes statiques pour les opérations signées et non signées, à moins que vous n'ayez besoin que d'opérations signées dans le code, et c'est correct de utilisez uniquement les opérateurs.
Je recommande également d'éviter d'utiliser des types primitifs courts , int et longs , et d'utiliser le mot , dword et qword , et vous êtes sur le point d'appeler les méthodes statiques pour les opérations non signées et / ou les opérations signées au lieu d'utiliser des opérateurs.
Si vous êtes sur le point de faire des opérations signées uniquement et que vous n'utilisez les opérateurs que dans le code, alors vous pouvez utiliser ces types primitifs courts , int et long .
En fait word , dword et qword n'existent pas dans le langage, mais vous pouvez créer une nouvelle classe pour chacun et l'implémentation de chacun devrait être très facile:
Le mot de classe ne contient que le type primitif court , la classe dword ne contient que le type primitif int et la classe qword ne contient que le type primitif long . Maintenant, toutes les méthodes non signées et signées sont statiques ou non selon votre choix, vous pouvez implémenter dans chaque classe, c'est-à-dire toutes les opérations 16 bits à la fois non signées et signées en donnant des noms significatifs sur la classe de mots , toutes les opérations 32 bits non signées et signé en donnant des noms de signification sur la classe dword et toutes les opérations 64 bits non signées et signées en donnant des noms de signification sur la classe qword .
Si vous n'aimez pas donner trop de noms différents pour chaque méthode, vous pouvez toujours utiliser la surcharge en Java, bon de lire que Java n'a pas supprimé cela aussi!
Si vous voulez des méthodes plutôt que des opérateurs pour les opérations signées 8 bits et des méthodes pour les opérations non signées 8 bits qui n'ont aucun opérateur, vous pouvez créer la classe Byte (notez que la première lettre «B» est en majuscule, donc ce n'est pas le octet de type primitif ) et implémenter les méthodes de cette classe.
À propos du passage par valeur et du passage par référence:
Si je ne me trompe pas, comme en C #, les objets primitifs sont passés naturellement par valeur, mais les objets classe sont passés naturellement par référence, ce qui signifie que les objets de type Byte , word , dword et qword seront passés par référence et non par valeur par défaut. Je souhaite que Java ait des objets struct comme C #, afin que tous les octets , mots , dword et qword puissent être implémentés pour être struct au lieu de classe, donc par défaut, ils ont été passés par valeur et non par référence par défaut, comme tout objet struct en C #, comme les types primitifs, sont passés par valeur et non par référence par défaut, mais parce que Java est pire que C # et nous avons pour y faire face, il n'y a que des classes et des interfaces, qui sont passées par référence et non par valeur par défaut. Donc, si vous voulez passer des objets Byte , word , dword et qword par valeur et non par référence, comme tout autre objet de classe en Java et également en C #, vous devrez simplement utiliser le constructeur de copie et c'est tout.
C'est la seule solution à laquelle je peux penser. Je souhaite juste que je puisse simplement taper les types primitifs en word, dword et qword, mais Java ne prend pas en charge typedef ni n'utilise du tout, contrairement à C # qui prend en charge l' utilisation , qui est équivalent au typedef du C.
À propos de la sortie:
Pour la même séquence de bits , vous pouvez les imprimer de plusieurs façons: en binaire, en décimal (comme la signification de% u dans C printf), en octal (comme la signification de% o en C printf), en hexadécimal (comme la signification de% x dans C printf) et comme entier (comme la signification de% d dans C printf).
Notez que C printf ne connaît pas le type des variables transmises en tant que paramètres à la fonction, donc printf ne connaît le type de chaque variable que depuis l'objet char * passé au premier paramètre de la fonction.
Ainsi, dans chacune des classes: octet , mot , dword et qword , vous pouvez implémenter la méthode d'impression et obtenir les fonctionnalités de printf, même si le type primitif de la classe est signé, vous pouvez toujours l'imprimer comme non signé en suivant un algorithme impliquant opérations logiques et de décalage pour obtenir les chiffres à imprimer sur la sortie.
Malheureusement, le lien que je vous ai donné ne montre pas comment implémenter ces méthodes d'impression, mais je suis sûr que vous pouvez rechercher sur Google les algorithmes dont vous avez besoin pour implémenter ces méthodes d'impression.
C'est tout ce que je peux répondre à votre question et vous suggérer.