2009-04-03 2 views
1

Я пытаюсь построить большой Int64 с информацией полубайта, хранящейся в байтах.Почему это конкретное переполнение операции (см. CS0220) в C#?

следующие строки кода работы, как и ожидалось:

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

Почему следующая строка приведет к ошибке компиляции CS0220 «Операция перетекает во время компиляции в проверяемой режиме», а другие нет?

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

Результат будет выглядеть так:

FFFFFFFFD0000000 

вместо:

0000D0000000 

Может кто-нибудь объяснить это? Теперь я конвертирую с операторами сдвига, но все же любопытно, почему этот подход не работает!

Обновление: ошибка также возникает при использовании (Int64) (0x0d < < 28).

ответ

2

Вы должны отметить постоянные значения конкретно, как тоскует (Int64s) или, возможно, ulongs (UInt64s), в противном случае по умолчанию они будут интерпретатор как Интс (т.е. Int32s), явно вызывая переполнение. Кастинг после операции умножения в этом случае не принесет вам никакой пользы.

Не проверял, но этот код должен работать:

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

Вы были быстрее! Закончил тот же ответ, когда появился ответ. +1. Полностью согласен с ответом :) –

+0

Хех. это происходит все время, для меня тоже. :) В любом случае, спасибо. – Noldorin

-1

Первый взгляд Я бы предположил, что он выполняет умножение с Int32 и переполняется. Вам нужно передать отдельные операнды в Int64, а затем умножить их. Прямо сейчас вы делаете только результат.

Это не я, потому что я не знаю, почему это может найти проблему только с одной строкой, а не с первым номером.

ND

+0

-1: Cast требует, чтобы компилятор/JIT оптимизировал преобразование времени выполнения. Лучше использовать длинный литерал для начала. – Richard

1

Целые литералы имеют тип Int32 (даже если в шестнадцатеричном). Используйте суффикс «L», чтобы сделать их длинными (Int64).

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

 Смежные вопросы

  • Нет связанных вопросов^_^