Сдвиг с 64-битным int

У меня есть переменная __int64 x = 0x8000000000000000,

Я пытаюсь сдвинуть его побайтно: x >> 4

Я думал, что результат должен быть 0x0800000000000000но к сожалению я получаю 0xf800000000000000,

Я использую VS10. Почему это так? И как я могу решить это?

1

Решение

Причина в том, что смещение чисел со знаком определяется языком только в том случае, если левый операнд равен по крайней мере 0. В вашем случае я предполагаю, что это представление с двумя дополнениями, а ваше число отрицательное, что делает результат неуказанным (или определяемым реализацией, я не не имею под рукой ссылку прямо сейчас). Обычно вы получаете либо логический, либо арифметический сдвиг.

Если вам удастся сделать вашу переменную без знака, это решит вашу проблему.

2

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

попробуй использовать __uint64 variable x = 0x8000000000000000

Я думаю, что вы можете заявить об этом и так:

u64 x = 0x8000000000000000;

x >> 4 вы дадите вам:

0x0800000000000000

см. для получения дополнительной информации, где F пришел от в MSB.

4

Ну, это легко. 🙂

Ваш номер подписан. Когда установлен первый бит, он отрицательный. Таким образом, чтобы сохранить его отрицательным, он заполняется 1 с.

Я предполагаю, что приведение к unsigned, а затем смещение должно решить вашу проблему.

2

Это потому, что у вас есть отрицательное число. Используйте (или конвертируйте в) unsigned перед сменой.

1

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

int _tmain(int argc, _TCHAR* argv[])
{
__int64  signedval;
unsigned __int64  unsignedval;

signedval=0x8000000000000000 >> 4;
unsignedval=0x8000000000000000 >> 4;

printf(" Signed %x  , unsigned %x   \n", signedval, unsignedval);

getchar();

return 0;
}

и вывод:

Signed 0  , unsigned 8000000
1
По вопросам рекламы [email protected]