Самое быстрое преобразование UInt32 в int в C # - PullRequest
1 голос
/ 02 января 2011

У меня есть быстрая подпрограмма на уровне битов, которая вычисляет значение и возвращает UInt32. Мне нужно хранить это значение в SQL Server в 32-битном поле int. Я не хочу увеличивать размер поля, а просто хочу сохранить «байты» из этой функции в поле int.

Одновременно запрашиваются сотни этих записей, поэтому мне нужен самый быстрый способ преобразования UInt32 в int в цикле. Если крайний левый бит установлен в UInt32, он должен установить бит знака int (или сделать что-нибудь «повторяемое», правда, но бит знака, вероятно, будет проще).

Другими словами, я просто хочу, чтобы 4 байта UInt32 стали 4 байтами 32-битного целого. Я мог бы использовать класс BitConverter, но я не уверен, что это самый быстрый способ. Было бы быстрее сделать это с непроверенной областью, подобной этой:

UInt32 fld = 4292515959;
unchecked {
    return (int)fld;
    // -2451337
}

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

Самый быстрый способ приведения int к UInt32 поразрядно?

Ответы [ 2 ]

3 голосов
/ 02 января 2011

Я бы сказал, что непроверенная версия (например, unchecked((int)x)) - самый быстрый способ, так как нет вызова метода. Я не верю, что есть более быстрый путь.

Кстати, UInt32 - это просто другое название для uint ... идти в одном направлении - это то же самое, что идти в другом направлении с точки зрения производительности, так что это действительно то же самое, что и ссылка, которую вы разместили.


Редактировать: Я помню, как из первых рук наблюдал экземпляр эталонного теста, где checked был быстрее , чем unchecked (и нет, это была не отладочная сборка, это была сборка выпуска оптимизации). Я не знаю, почему это произошло, но в любом случае, не думайте, что вы получите что-то измеримое путем поворота проверки переполнения.

0 голосов
/ 20 марта 2019

unchecked((int)x) требуется, только приведение констант и проверка и снятие отметки дает одинаковые результаты (если код может компилироваться)

Например, этот код

uint data = 4292515959;
int uncheckedData;
int checkedData;
unchecked {
    uncheckedData = (int)data;
}
checkedData = (int)data;

Console.WriteLine(data);
Console.WriteLine(uncheckedData);
Console.WriteLine(checkedData);

производит этот вывод

4292515959
-2451337
-2451337

Чтобы быть более кратким, этот код можно скомпилировать (тот же результат, что и unchecked((int)data))

uint data = 4292515959;
checkedData = (int)data;

Этот код (обратите внимание на const) не может быть скомпилирован (требуется снят)

const uint data = 4292515959;
checkedData = (int)data;

Этот код также не может быть скомпилирован (требуется снят)

checkedData = (int)4292515959;
...