Почему эта конкретная операция переполнена (см. CS0220) в C #? - PullRequest
1 голос
/ 03 апреля 2009

Я пытаюсь сконструировать большой Int64 с полубайтовой информацией, хранящейся в байтах.

Следующие строки кода работают как положено:

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). </p>

Ответы [ 3 ]

2 голосов
/ 03 апреля 2009

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

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

Console.WriteLine("{0:X12}", 0x0dL * 0x100000000L);
Console.WriteLine("{0:X12}", 0x0dL * 0x1000000L);
Console.WriteLine("{0:X12}", 0x0dL * 0x100000L);
1 голос
/ 03 апреля 2009

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

Console.WriteLine("{0:X12}", 0x0dL * 0x100000000L);
0 голосов
/ 03 апреля 2009

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

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

ND

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...