У меня есть переменная __int64 x = 0x8000000000000000
,
Я пытаюсь сдвинуть его побайтно: x >> 4
Я думал, что результат должен быть 0x0800000000000000
но к сожалению я получаю 0xf800000000000000
,
Я использую VS10. Почему это так? И как я могу решить это?
Причина в том, что смещение чисел со знаком определяется языком только в том случае, если левый операнд равен по крайней мере 0. В вашем случае я предполагаю, что это представление с двумя дополнениями, а ваше число отрицательное, что делает результат неуказанным (или определяемым реализацией, я не не имею под рукой ссылку прямо сейчас). Обычно вы получаете либо логический, либо арифметический сдвиг.
Если вам удастся сделать вашу переменную без знака, это решит вашу проблему.
попробуй использовать __uint64 variable x = 0x8000000000000000
Я думаю, что вы можете заявить об этом и так:
u64 x = 0x8000000000000000;
x >> 4
вы дадите вам:
0x0800000000000000
см. для получения дополнительной информации, где F
пришел от в MSB.
Ну, это легко. 🙂
Ваш номер подписан. Когда установлен первый бит, он отрицательный. Таким образом, чтобы сохранить его отрицательным, он заполняется 1 с.
Я предполагаю, что приведение к unsigned, а затем смещение должно решить вашу проблему.
Это потому, что у вас есть отрицательное число. Используйте (или конвертируйте в) unsigned перед сменой.
Значения со знаком сдвигаются вправо на знаковый бит и без знака на ноль:
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