Ci sono domande su why Java doesn't support unsigned types e alcune domande su come gestire i tipi senza segno. Ho fatto qualche ricerca, e sembra che Scala non supporti anche i tipi di dati non firmati. La limitazione nella progettazione del linguaggio di Java e Scala, nel bytecode generato, o nella stessa JVM? Potrebbe esserci un linguaggio che gira su JVM ed è altrimenti identico a Java (o Scala), ma supporta i tipi di dati primitivi senza segno?La mancanza di tipi primitivi non firmati di Java è una caratteristica di Java la piattaforma o Java del linguaggio?
risposta
Java Bytecode Specification solo defines signed types:
I tipi integrali sono byte, short, int, e lungo, i cui valori sono 8-bit, 16 bit, 32 bit e 64 bit con segno interi a due complementi
Ma un linguaggio implementato sulla JVM può probabilmente aggiungere un tipo non firmato a livello sintattico e gestire la conversione in fase di compilazione.
La gestione dell'aritmetica non firmata è un problema di lingua/implementazione, non di piattaforma: potrebbe essere simulato su qualsiasi piattaforma, anche se non vi fosse alcun supporto nativo.
La JVM non ha un tipo, quindi Java/Scala/ecc. non supportarlo "out of the box".
Sebbene tipo unsigned potrebbe essere emulato a livello bytecode ci sono alcuni inconvenienti con quel:
Performance: Si avrebbe bisogno di diverse operazioni di bytecode per ogni semplice operazione aritmetica. Le prestazioni del codice che utilizzano i tipi non firmati non firmati sarebbero due o tre volte peggiori rispetto al codice che utilizza i tipi firmati.
Compatibilità: la maggior parte delle lingue in esecuzione su una JVM tenta di essere molto compatibile con l'enorme quantità di codice Java disponibile. Questo naturalmente verrebbe immediatamente rovinato quando verranno introdotti tipi aggiuntivi o quando alcune variabili con tipi "conosciuti" devono essere gestite diversamente.
Alla luce di ciò, i vantaggi per i tipi non firmati sono IMHO trascurabili.
Le aggiunte e le sottrazioni di numeri uguali non sarebbero influenzate. Il confronto sarebbe probabilmente il più grande fastidio. – supercat
@supercat: perché la pensi così? –
Le uniche operazioni a cui posso pensare saranno interessate dalla divisione, i confronti e le conversioni in tipi "long" o floating-point. Di questi, i confronti sarebbero usati più frequentemente degli altri e normalmente richiederebbero il minor tempo possibile. – supercat
- 1. Java JLS specifica la promozione di tipi di wrapper primitivi?
- 2. costo per la fusione di tipi primitivi in Java
- 3. Perché i tipi di dati primitivi Java non si chiamano tipi di dati java?
- 4. Le enumerazioni Java sono considerate tipi primitivi o di riferimento?
- 5. regole di fusione per tipi primitivi in Java
- 6. Java definisce la dimensione dei suoi tipi primitivi ovunque?
- 7. Perché la dimensione primitiva booleana di Java non è definita?
- 8. Qual è la differenza tra Java (linguaggio di programmazione) e Java (Pannello di controllo)?
- 9. I tipi di dati primitivi thread-safe in Java
- 10. Java fonetica o pronuncia del linguaggio
- 11. Perché la piattaforma GUI di Java è denominata "Swing?"
- 12. tipo di tipi in Java
- 13. Come aggirare la mancanza di campi astratti in Java?
- 14. Perché la JVM non è indipendente dalla piattaforma, dato che Java (il linguaggio) è indipendente dalla piattaforma?
- 15. Java è un linguaggio di programmazione compilato o interpretato?
- 16. È una matrice Java di primitivi memorizzati nello stack o nell'heap?
- 17. Tipi misti di mapping Java
- 18. Perché la cancellazione del tipo di Java non la rompe?
- 19. java: Arrays.asList Understanding (T ... array) Metodo per i tipi primitivi
- 20. Java Reflection chiamando costruttore con i tipi primitivi
- 21. Cosa si intende per Numeri reali o valori in java e una spiegazione molto elementare dei tipi primitivi in java
- 22. Il meccanismo di versioning forzato dalla piattaforma è la funzionalità più necessaria di java?
- 23. Ottenere valore predefinito per Java i tipi primitivi
- 24. Strano comportamento java con i cast per i tipi primitivi
- 25. Porting di app java sulla piattaforma Android
- 26. Java o Python per l'elaborazione del linguaggio naturale
- 27. Java librerie della piattaforma HashCode
- 28. isAssignableFrom con tipi di riferimento e primitivi
- 29. L'RNG di Java (utilizzando le sementi) è indipendente dalla piattaforma?
- 30. Esiste una raccolta di vecchi problemi di sicurezza con la descrizione e l'esercizio del codice per la piattaforma Java?
Non ho mai pensato di guardare le specifiche del bytecode. Avrei dovuto. Ho solo guardato le specifiche della lingua Java e vari documenti Scala. –
"Gli operatori di interi incorporati non indicano un overflow (positivo o negativo) in alcun modo, si avvolgono in overflow." Ciò indicherebbe anche che se gestisci correttamente i casi, puoi effettivamente implementare tipi di dati non firmati usando gli operatori aritmetici standard. –
Nel passato lavoravo con l'API di QuckTime Java che era solo un wrapper attorno alla libreria nativa di QuickTime che, se la mia memoria mi serviva, era piena di tipi interi non cancellati. Era un po 'imbarazzante api-saggio, ma la conversione firmata senza segno funzionava bene. –