Почему right shift числа на количество бит типа не дает 0?
От: Аноним Земля  
Дата: 04.09.15 18:06
Оценка: 5 (1)
Сабж %-)

void Main()
{
    Console.WriteLine(uint.MaxValue >> 32);
    Console.WriteLine(int.MaxValue >> 32);
    
    Console.WriteLine(ulong.MaxValue >> 64);
    Console.WriteLine(long.MaxValue >> 64);
}

результат

4294967295
2147483647
18446744073709551615
9223372036854775807

Re: Почему right shift числа на количество бит типа не дает 0?
От: BulatZiganshin  
Дата: 04.09.15 22:12
Оценка: +2
Здравствуйте, Аноним, Вы писали:

А>Сабж %-)


так реализовано в процессорах intel. попробуй ещё сдвиг на 65 бит
Люди, я люблю вас! Будьте бдительны!!!
Re: Почему right shift числа на количество бит типа не дает 0?
От: andrey.desman  
Дата: 04.09.15 22:41
Оценка: 4 (1)
Здравствуйте, Аноним, Вы писали:

А>Сабж %-)


Ответ для C++ (читать второй), но смысл тот же.
Re: Почему right shift числа на количество бит типа не дает 0?
От: LaptevVV Россия  
Дата: 05.09.15 05:25
Оценка:
Причина может быть в том, что сдвиг вправо реализован как арифметический.
При арифметическом сдвиге знаковый разряд воспроизводится.
Поэтому для отрицательных чисел нуля никогда не получится — только -1.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: Почему right shift числа на количество бит типа не дает 0?
От: BulatZiganshin  
Дата: 05.09.15 16:03
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Причина может быть в том, что сдвиг вправо реализован как арифметический.

LVV>При арифметическом сдвиге знаковый разряд воспроизводится.
LVV>Поэтому для отрицательных чисел нуля никогда не получится — только -1.

интересная идея — она могла бы объяснить первый и третий результат (если все сдвиги в языке знаковые), но не годится для двух оставшихся
Люди, я люблю вас! Будьте бдительны!!!
Re[3]: Почему right shift числа на количество бит типа не дает 0?
От: LaptevVV Россия  
Дата: 05.09.15 16:29
Оценка:
BZ>интересная идея — она могла бы объяснить первый и третий результат (если все сдвиги в языке знаковые), но не годится для двух оставшихся
Вообще у меня такое впечатление, что сдвиг просто не выполняется...
Или он циклический...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[4]: Почему right shift числа на количество бит типа не дает 0?
От: BulatZiganshin  
Дата: 05.09.15 16:31
Оценка: 6 (2) +1
Здравствуйте, LaptevVV, Вы писали:

LVV>Вообще у меня такое впечатление, что сдвиг просто не выполняется...


x86 использует только младшие 4-5-6 бит CL для определения величины сдвига. это повелось ещё с 1978 года и затем было повторено в 32/64-битных архитектурах
Люди, я люблю вас! Будьте бдительны!!!
Re[5]: Почему right shift числа на количество бит типа не дает 0?
От: LaptevVV Россия  
Дата: 05.09.15 16:44
Оценка:
LVV>>Вообще у меня такое впечатление, что сдвиг просто не выполняется...
BZ>x86 использует только младшие 4-5-6 бит CL для определения величины сдвига. это повелось ещё с 1978 года и затем было повторено в 32/64-битных архитектурах
Не, это понятно. 32 — это 5-й разряд (от 0-ого).
Сами величины как будто не сдвигаются.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[6]: Почему right shift числа на количество бит типа не дает 0?
От: BulatZiganshin  
Дата: 05.09.15 16:46
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>>>Вообще у меня такое впечатление, что сдвиг просто не выполняется...

BZ>>x86 использует только младшие 4-5-6 бит CL для определения величины сдвига. это повелось ещё с 1978 года и затем было повторено в 32/64-битных архитектурах
LVV>Не, это понятно. 32 — это 5-й разряд (от 0-ого).
LVV>Сами величины как будто не сдвигаются.

32 = 100000b

cpu берёт младшие 5 бит, т.е. 00000b и на эти 0 бит сдвигает
Люди, я люблю вас! Будьте бдительны!!!
Re[7]: Почему right shift числа на количество бит типа не дает 0?
От: LaptevVV Россия  
Дата: 05.09.15 16:48
Оценка:
LVV>>Сами величины как будто не сдвигаются.
BZ>32 = 100000b
BZ>cpu берёт младшие 5 бит, т.е. 00000b и на эти 0 бит сдвигает
Спасибо. Надо было просто в справочник посмотреть...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.