Комментарии 5
Ха, люблю такое, спасибо.
На x86_64 запись 32-битного регистра приводит к обнулению старших битов соответствующего регистра: http://x86asm.net/articles/x86-64-tour-of-intel-manuals/
Поэтому неверно, что в старших битах остаётся мусор. А поскольку в конвенциях вызова регистр для аргумента и регистр для результат разные, то мы в любом случае получаем обнуление старших битов.
Можно расширять unsigned - тоже дешевле расширения signed.
Что интересно, clang создаёт одинаковый код, но есть подозрение, что asm ухудшит оптимизацию реального кода.
Весело, но интересно добиться того же без asm.
Легко :) Надо просто дать понять компилятору что ты имеешь ввиду и он всё поймет)
Скрытый текст
int64_t convert(int32_t num) {
int64_t r;
memcpy(&r, &num, 4);
return r;
}Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Информация
- Сайт
- wunderfund.io
- Дата регистрации
- Дата основания
- Численность
- 11–30 человек
- Местоположение
- Россия
- Представитель
- xopxe
Глупые фокусы: преобразование 32-битного значения в 64-битное, когда неважен мусор в старших битах