Тип безопасности и инструкция NEG

Мне нужно портировать эту инструкцию по сборке:

NEG eax

поэтому я сделал следующее:

uint32_t a = 0x1234568;
a = reinterpret_cast<uint32_t>(-a);

поскольку reinterpret_cast делает то, что я хочу, что означает интерпретацию байтов напрямую без какого-либо преобразования / преобразования.

  • Нужно ли мне reinterpret_cast для этого?
  • Это нарушает строгий псевдоним?
  • Если я делаю это неправильно, как лучше всего это реализовать?

Я задаю этот вопрос, потому что, хотя код, по-видимому, работает под gcc, он не работает под Visual Studio (cannot convert from uint32_t to uint32_t а также unary minus operator applied to unsigned type, result still unsigned). Ошибки имеют смысл, но я не уверен, как я могу сделать это по-другому, за исключением вычисления дополнительных 2 с использованием битовых хаков.

2

Решение

  • Вам не нужно reinterpret_cast здесь static_cast достаточно.
  • Ваш код не работает с указателями, поэтому нет проблем с алиасами.
  • Вывод: в этом подходе нет ничего плохого.

Кстати: ваш код действительно компилируется с инструкцией «neg», по крайней мере, на платформах Intel. 😉


Обновить:

Спецификация языка C ++ гласит:

Операнд унарного оператора должен иметь арифметический или перечислимый тип, а результатом является отрицание его операнда. Интегральное продвижение выполняется для целочисленных или перечислимых операндов. Отрицательное число без знака вычисляется путем вычитания его значения из 2N, где N количество битов в повышенном операнде. Тип результата — это тип повышенного операнда.

А так как неподписанные типы повышаются до самих себя, одинарный минус может применяться к неподписанным типам и не меняет их.

Так что правильно написать, например:

uint32_t convert( uint32_t x ) {
return -x;
}

static_cast можно использовать там, но это не нужно. reinterpret_cast не может быть использован для преобразования целых чисел.

3

Другие решения

я хотел бы использовать a = 0 - a;, Или вы можете иметь a = -a; однако это может дать предупреждение компиляции. Предупреждение не ошибка, однако этого следует избегать.

Также вы можете попробовать встроенную сборку.

mov eax, a
neg eax
mov a, eax
0

По вопросам рекламы [email protected]