2014 dxdy logo

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

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




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


27/01/09
814
Уфа
Преобразуйте в дополнительный код байт 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
814
Уфа
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
4587
Равны. Операция сдвига влево эквивалентна умножению на 2.

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


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

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


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

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


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

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


27/01/09
814
Уфа
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
814
Уфа
Фактически из любого отрицательного (которое не даст сразу переполнения), максимально отрицательное будет последним (если влево сдвигать), после него будет вечный 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
814
Уфа
А $\lfloor ... \rfloor$ как определяется?

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

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



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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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