Pergunta

Eu tento construir um grande Int64 com informações mordidela armazenados em bytes.

As seguintes linhas de código funcionam como esperado:

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

Por que faz o seguinte linha de chumbo a um CS0220 erro de compilação "A operação transborda em tempo de compilação no modo verificado" e os outros não?

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

O resultado seria:

FFFFFFFFD0000000

em vez de:

0000D0000000

Alguém pode explicar isso? Agora vou converter com operadores de deslocamento, mas ainda curioso porque essa abordagem não funciona!

Update:. O erro também ocorre quando usando (Int64) (0x0d << 28)

Foi útil?

Solução

Você precisa para marcar os valores constantes especificamente como longs (Int64s) ou possivelmente ulongs (UInt64s), caso contrário, por padrão, eles serão intérprete como ints (ou seja Int32s), causando claramente transborda. Fundição após a operação de multiplicação não vai fazer nenhum bem neste caso.

Não testei, mas este código deve funcionar:

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

Outras dicas

literais inteiros têm o tipo Int32 (mesmo que em hexadecimal). Usar o sufixo "L" para torná-los longs (Int64).

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

primeira vista eu acho que ele está fazendo a multiplicação com um Int32, e transbordando. Você precisa lançar os operandos individuais para Int64 em seguida, multiplicar esses. Agora você só está lançando o resultado.

Dito isso, eu não sei por que ele só iria encontrar problema com que uma linha e não o primeiro com o número maior.

ND

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top