Мне нужно портировать эту инструкцию по сборке:
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 с использованием битовых хаков.
reinterpret_cast
здесь static_cast
достаточно.Кстати: ваш код действительно компилируется с инструкцией «neg», по крайней мере, на платформах Intel. 😉
Обновить:
Спецификация языка C ++ гласит:
Операнд унарного оператора должен иметь арифметический или перечислимый тип, а результатом является отрицание его операнда. Интегральное продвижение выполняется для целочисленных или перечислимых операндов. Отрицательное число без знака вычисляется путем вычитания его значения из 2N, где N количество битов в повышенном операнде. Тип результата — это тип повышенного операнда.
А так как неподписанные типы повышаются до самих себя, одинарный минус может применяться к неподписанным типам и не меняет их.
Так что правильно написать, например:
uint32_t convert( uint32_t x ) {
return -x;
}
static_cast
можно использовать там, но это не нужно. reinterpret_cast
не может быть использован для преобразования целых чисел.
я хотел бы использовать a = 0 - a;
, Или вы можете иметь a = -a;
однако это может дать предупреждение компиляции. Предупреждение не ошибка, однако этого следует избегать.
Также вы можете попробовать встроенную сборку.
mov eax, a
neg eax
mov a, eax