2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3  След.
 
 Re: Операция побитового сдвига и представление целых чисел
Сообщение05.11.2012, 20:08 
Аватара пользователя


27/01/09
815
Уфа
Преобразуйте в дополнительный код байт 129, т.е. получите в байте число -129. :)

 Профиль  
                  
 
 Re: Операция побитового сдвига и представление целых чисел
Сообщение05.11.2012, 20:30 


22/07/12
560
Chifu в сообщении #640434 писал(а):
Преобразуйте в дополнительный код байт 129, т.е. получите в байте число -129. :)

В байте помещается число от -128 до 127, поэтому ваш вопрос тут не уместен.

Munin в сообщении #640427 писал(а):
Результат сдвига будет гарантированно такой, как будто число - непрерывная ячейка памяти из скольки-то-надцати бит.


Если честно, то я не совсем понял, что вы имели ввиду.....переполнение по-моему ещё никто не отменял).....поясните пожалуйста поподробней.

 Профиль  
                  
 
 Re: Операция побитового сдвига и представление целых чисел
Сообщение05.11.2012, 20:46 
Заслуженный участник
Аватара пользователя


30/01/06
72407
main.c в сообщении #640441 писал(а):
Если честно, то я не совсем понял, что вы имели ввиду.....переполнение по-моему ещё никто не отменял).....поясните пожалуйста поподробней.

Я имею в виду, что когда вы сдвигаете 32-битный int, то выход за пределы 8-битных ячеек вас никак не касается. Сдвиг на 27 бит произойдёт совершенно спокойно (если значение позволит). Сдвиг на 32 бита и больше, конечно же, приведёт к переполнению, но здесь имеют значение именно 32 бита, а никак не 8.

 Профиль  
                  
 
 Re: Операция побитового сдвига и представление целых чисел
Сообщение05.11.2012, 21:09 
Аватара пользователя


27/01/09
815
Уфа
main.c в сообщении #640441 писал(а):
В байте помещается число от -128 до 127, поэтому ваш вопрос тут не уместен.
А вы фактически говорили, что 129 и -129 одинаковой длины. Модуль отрицательного числа можно на 1 бит влево дальше сдвинуть.
И что вы понимаете под переполнением, чем оно от переноса отличается? :)

 Профиль  
                  
 
 Re: Операция побитового сдвига и представление целых чисел
Сообщение05.11.2012, 21:43 


22/07/12
560
Munin в сообщении #640446 писал(а):
main.c в сообщении #640441 писал(а):
Если честно, то я не совсем понял, что вы имели ввиду.....переполнение по-моему ещё никто не отменял).....поясните пожалуйста поподробней.

Я имею в виду, что когда вы сдвигаете 32-битный int, то выход за пределы 8-битных ячеек вас никак не касается. Сдвиг на 27 бит произойдёт совершенно спокойно (если значение позволит). Сдвиг на 32 бита и больше, конечно же, приведёт к переполнению, но здесь имеют значение именно 32 бита, а никак не 8.


Тогда вот так, надо думаю уточнить вопрос, нам дано 8-разрядное целое отрицательное знаковое число $A$, мы сдвинем это число влево на X позиций, и получим какое-то число $B$ , а теперь возьмём то же самое число $A$, но сначала вычислим его модуль, затем сдвинем получившееся число так же на X позиций, причём этот сдвиг привёл к выходу нескольких значащих бит за пределы ячейки, а теперь делаем отрицание этого числа и получаем число $C$. Я прекрасно понимаю, что так как было переполнение, число получилось неправильное, и знак мог поменяться и ещё всякая фигня произойти, но вопрос не в правильности вычисления, а в том, что равны ли теперь числа $B$ и $C$.

 Профиль  
                  
 
 Re: Операция побитового сдвига и представление целых чисел
Сообщение05.11.2012, 21:54 
Заслуженный участник


04/05/09
4596
Равны. Операция сдвига влево эквивалентна умножению на 2.

 Профиль  
                  
 
 Re: Операция побитового сдвига и представление целых чисел
Сообщение05.11.2012, 21:57 


22/07/12
560
Вы учли, что было переполнение?

 Профиль  
                  
 
 Re: Операция побитового сдвига и представление целых чисел
Сообщение05.11.2012, 22:01 
Аватара пользователя


27/01/09
815
Уфа
venco в сообщении #640476 писал(а):
Равны. Операция сдвига влево эквивалентна умножению на 2.
Чисел со знаком тоже? Сдвигайте влево -86, что получится?

 Профиль  
                  
 
 Re: Операция побитового сдвига и представление целых чисел
Сообщение05.11.2012, 22:02 
Заслуженный участник


04/05/09
4596
Chifu в сообщении #640480 писал(а):
venco в сообщении #640476 писал(а):
Равны. Операция сдвига влево эквивалентна умножению на 2.
Чисел со знаком тоже? Сдвигайте влево -86, что получится?
То же самое, что и при умножении на 2.

 Профиль  
                  
 
 Re: Операция побитового сдвига и представление целых чисел
Сообщение05.11.2012, 22:05 
Аватара пользователя


27/01/09
815
Уфа
venco в сообщении #640481 писал(а):
То же самое, что и при умножении на 2.
Ааа ... как же я так, переполнение же будет ... (мы тут байты сдвигаем) :)

 Профиль  
                  
 
 Re: Операция побитового сдвига и представление целых чисел
Сообщение05.11.2012, 22:06 
Заслуженный участник
Аватара пользователя


30/01/06
72407
Поскольку диапазон чисел со знаком (8-битных, то есть для Си единственный вариант - тип signed char) несимметричен только для числа -128, то его и предлагаю рассмотреть повнимательнее: а что если B=-128? Из какого A оно может получиться, какое тогда будет C?

 Профиль  
                  
 
 Re: Операция побитового сдвига и представление целых чисел
Сообщение05.11.2012, 22:09 
Аватара пользователя


27/01/09
815
Уфа
Фактически из любого отрицательного (которое не даст сразу переполнения), максимально отрицательное будет последним (если влево сдвигать), после него будет вечный 0.

 Профиль  
                  
 
 Re: Операция побитового сдвига и представление целых чисел
Сообщение05.11.2012, 22:18 
Заслуженный участник
Аватара пользователя


30/01/06
72407
Chifu
Не положено давать полного решения учебной задачи.

 Профиль  
                  
 
 Re: Операция побитового сдвига и представление целых чисел
Сообщение06.11.2012, 07:32 


22/07/12
560
Рассмотрим сдвиг влево:

Пусть у нас было число $(-A)$, где $A>0$, число $A$ отрицательное.

В первом случае, после сдвига влево на $X$, получаем число $B=-A\cdot2^X$, во втором случае получим cначала число$A$, затем $A\cdot2^X$, ну а в итоге получим число $C=-A\cdot2^X$.
Числа $B$ и $C$ идентичны. Но предположим, что число $C$ вышло за диапазон от -128 до 127, тогда чтобы получить чему же равно $C$ в представлении компьютера надо прибавить к этому числу $256 n$, где $n -- некоторое целое число, такое, что $C + 256n$ входит в данный диапазон. Если у числа $C$ было переполнение, то и у числа $B$ тоже было переполнение, потому что числа $ B$ и $C$ идентичны, проведём с ним ту же самую операцию, в итоге получим равные числа $B + 256n$ и $C + 256n$, из этого следует, что 2 данных случая преобразования числа $(-A)$ всегда приводят нас к одному и тому же числу, не зависимо от того, было ли переполнение или нет.

Рассмотрим сдвиг вправо:

Сдвинем то же самое число на $X$ позиций, получим $\lfloor -A/2^X \rfloor$. Если же сначала взять модуль, $ A$, потом сдвинуть, $\lfloor A/2^X \rfloor$, и взять отрицание, получим число $ -\lfloor A/2^X \rfloor$. Числа $\lfloor -A/2^X \rfloor$ и $ -\lfloor A/2^X \rfloor$ равны тогда и только тогда, когда $A$ делится нацело на $2^X$, в противном случае первое число будет на 1 меньше второго.
Здесь выход значащих бит у числа A, за пределы ячейки так же ничего не поменяет, как только все значащие биты выйдут за пределы ячейки, первое число будет равно -1, а второе 0.

Пример сдвига вправо: было число $A = -7$, сдвигать будем на 1 позицию, получатся числа $B = \lfloor -7/2^1 \rfloor = \lfloor -3,5 \rfloor = -4 $, и $C = -\lfloor 7/2^1 \rfloor = -\lfloor 3,5 \rfloor$ = -3

Хотелось бы услышать критику по поводу моих рассуждений :wink:

 Профиль  
                  
 
 Re: Операция побитового сдвига и представление целых чисел
Сообщение06.11.2012, 11:18 
Аватара пользователя


27/01/09
815
Уфа
А $\lfloor ... \rfloor$ как определяется?

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 39 ]  На страницу Пред.  1, 2, 3  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: AntonioVivaldi


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group