2016-01-03 18 views
11

In C e C++, il comportamento di overflow o underflow con segno intero non è definito.Le specifiche C# e Java spiegano lo stesso comportamento sull'overflow di interi con segno?

In Java e C# (contesti non selezionati), il comportamento sembra essere definito in misura.


Dalla specifica Java, abbiamo:

Gli operatori interi non indicano overflow o underflow in alcun modo.

E:

Il linguaggio di programmazione Java utilizza la rappresentazione in complemento a due per i numeri interi [...]


Dalla specifiche C#, abbiamo:

[...] In un contesto non controllato, gli overflow vengono ignorati e un y i bit di ordine superiore che non rientrano nel tipo di destinazione vengono scartati.


Testando fuori entrambi, ho ottenuto l'atteso avvolgente risultato. A giudicare dalla formulazione delle specifiche, ho la sensazione che in Java il risultato sia portatile (perché la lingua richiede una rappresentazione complemento a 2) mentre C# può o non può avere quel risultato (dato che non sembra specificare una rappresentazione - solo che i bit di ordine superiore vengono scartati).

Quindi, entrambe le specifiche del linguaggio garantiscono lo stesso comportamento su tutte le piattaforme (solo con parole diverse)? Oppure sono semplicemente uguali tra loro nel mio caso di test (su x86 e sotto Sun's JRE e Microsoft's .NET), ma potrebbero teoricamente differire su altre architetture o implementazioni?

+0

Se il comportamento è ben definito per la lingua, perché dovrebbe differire tra le piattaforme ?! – JimmyB

+1

@HannoBinder Quando uso il termine * ben definito *, lo intendo in contrasto con * undefined * - né in Java né in C# è indefinito.Ma non riesco ancora a capire se le specifiche spiegano i risultati portatili o lascia semplicemente il comportamento come * definito dall'implementazione *. –

+0

Se si osserva * Utilizzo di valori interi a 32 bit non decimali * nella [documentazione System.Int32] (https://msdn.microsoft.com/en-us/library/system.int32.aspx) è possibile vedi che, almeno per gli ints, la rappresentazione è la stessa su tutte le piattaforme. Sospetto che sia lo stesso per altri tipi. –

risposta

1

In Java la portabilità è garantita da Java Language Specification che stabilisce tutte le regole attorno al tipo primitivo int con il numero intero a 32 bit del complemento firmato di 32 bit. Quindi la libreria standard implementa la classe Integer che include il valore int e aggiunge alcuni metodi di convenienza, ma è essenzialmente la stessa per quanto riguarda l'intervallo e l'overflow.

In .NET esistono anche tipi primitivi definiti dal CLR e anche questi sono racchiusi da classi e alias diversi a seconda della lingua. Vedi Common Language Specification - esp. Common Type Systtem.

Quindi, per rispondere alla tua domanda, in Java il codice è portatile come garantito dalla specifica di lingua e implementazione JVM. In .NET (poiché CLR esegue anche codice C++ che a sua volta può non essere compatibile con CLS funzionante più vicino al livello di ferro) è necessario assicurarsi che il proprio codice sia portatile rendendolo uguale a CLS Compliant. La buona notizia è che l'utilizzo di int e/o System.Int32 rende CLS compatibile, ergo portatile.