Domanda

cerco di costruire una grande Int64 con le informazioni memorizzate bocconcino in byte.

Le seguenti linee di lavoro codice come previsto:

Console.WriteLine("{0:X12}", (Int64)(0x0d * 0x100000000));
Console.WriteLine("{0:X12}", (Int64)(0x0d * 0x1000000));
Console.WriteLine("{0:X12}", (Int64)(0x0d * 0x100000));

Perché la riga seguente portare ad un errore di compilazione CS0220 "L'operazione trabocca al momento della compilazione in modalità controllato" e gli altri non lo fanno?

Console.WriteLine("{0:X12}", (Int64)(0x0d * 0x10000000));

Il risultato sarebbe:

FFFFFFFFD0000000

invece che:

0000D0000000

Qualcuno può spiegare questo? Passo ora a convertire con operatori di spostamento, ma ancora curioso di sapere perchè questo approccio non funziona!

Aggiornamento:. L'errore si verifica anche quando si utilizza (Int64) (0x0d << 28)

È stato utile?

Soluzione

È necessario marcare i valori costanti specificamente come anela (Int64s) o, eventualmente, ulongs (UInt64s), altrimenti di default saranno interprete come interi (cioè Int32s), causando chiaramente overflow. Casting dopo l'operazione di moltiplicazione non farà alcun bene in questo caso.

Non ho ancora testato, ma questo codice dovrebbe funzionare:

Console.WriteLine("{0:X12}", 0x0dL * 0x100000000L);
Console.WriteLine("{0:X12}", 0x0dL * 0x1000000L);
Console.WriteLine("{0:X12}", 0x0dL * 0x100000L);

Altri suggerimenti

letterali interi hanno tipo Int32 (anche se in esadecimale). Utilizzare il suffisso "L" per renderli Longs (Int64).

Console.WriteLine("{0:X12}", 0x0dL * 0x100000000L);

Per prima vista direi che sta facendo la moltiplicazione con un Int32, e traboccante. È necessario lanciare i singoli operandi per Int64 quindi moltiplicare quelli. In questo momento si sta solo gettando il risultato.

Detto questo, io non so perché sarebbe trovare solo problema con che una linea e non il primo con il numero maggiore.

ND

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top