Я пытаюсь проверить и посмотреть, установлен ли бит в неподписанном int. Я не уверен, как я могу это сделать, но я предполагаю, что это будет что-то вроде этого. Я пытаюсь сделать инструкцию cdq в C ++ (но функцию)
Вот что у меня есть
unsigned int cdq(unsigned int eax)
{
unsigned int edx = 0;
if( (eax >> 31) & 1 ) { edx = 0xFFFFFFFF; }
return edx
}
Когда я использую функцию со следующими значениями:
бит 31 cdq (0x12345678) установлен (1), поэтому он должен возвращать (без знака int) -1
бит 31 cdq (0x01) не установлен (0), поэтому он должен возвращать 0
Проблема в том, что он всегда возвращает 0, и я не уверен, почему
бит 31 (0x12345678) установлен (1)
Нет, это не так … старший бит установлен как бит 28:
1 2 3 4 5 6 7 8
0001 0010 0011 0100 0101 0110 0111 1000
^ ^
| |
31 28
Ваш код должен работать, но я бы использовал
if( eax & (1U << 31) ) edx = 0xFFFFFFFF;
так как он немного более прямой и смещает константу, а не переменную, поэтому он меньше работает во время выполнения (хотя оптимизирующий компилятор должен генерировать одинаковый код для обоих).
На самом деле я бы написал что-то вроде
int cdq(int eax)
{
return eax < 0? -1 : 0;
}
Кстати, ваш код на самом деле не реализует cdq, потому что ваши переменные eax и edx не являются аппаратными регистрами eax и edx. И на самом деле не очень хорошая идея реплицировать инструкции ASM как функции C, так или иначе … C имеет свои собственные функции для выполнения таких действий, например,
int32_t foo = -0x12345678;
int64_t bar = (int64_t)foo;
Других решений пока нет …