Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.86
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
#1

Обьясните понятие как работает Операция языка - C++

21.07.2013, 14:53. Просмотров 1854. Ответов 62
Метки нет (Все метки)

Простите пожалуста, если я не видел аналогичной темы.

Вот

Операции сдвига ( « и » ) применяются к целочисленным операндам. Они
сдвигают двоичное представление первого операнда влево или вправо на количество
двоичных разрядов, заданное вторым операндом. При сдвиге влево ( « ) освободившиеся
разряды обнуляются. При сдвиге вправо (>) освободившиеся биты
заполняются нулями, если первый операнд беззнакового типа, и знаковым разрядом
в противном случае. Операции сдвига не учитывают переполнение и потерю
значимости.

Как-то не ложится в мозг. Тупо читал минут 15, неи очень что-то понял.. Можно пожалуста на примерах?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.07.2013, 14:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Обьясните понятие как работает Операция языка (C++):

Обьясните как работает рекурсия - C++
#include <iostream> using namespace std; int Multiply(int, int); int main() { int number; int exponent; cout<<"Enter...

Обьясните, как работает цикл - C++
#include <iostream> #include <string> using namespace std; int main() { int j = 0; string str,str1; cout<<"Enter str ";...

обьясните пожалуйта как работает программа - C++
#include <sstream> #include <iostream> int main() { std::stringstream ss; long int u, count = 0; std::cout <<"Vvedite celoe...

Обьясните как работает рекурсия в данной задаче - C++
есть вот такая програмка: #include <stdio.h> #include <conio.h> int a,cnt=0,N,K; void fun(long S, int tek) { ...

метод гауса..обьясните как работает программа - C++
ipMatr(); for(opMatr(),k=0;k<=n;k++) //прямой ход метода Гаусса; {for(aa=fabs(a),i=k,j=k+1;j<=n;j++)//поиск макс....

Функция C++ в php или обьясните по подробнее как она работает - C++
typedef std::basic_ostringstream<Char> OStringStream; std::string ByteArrayToHexStr(uint8 const* bytes, uint32 arrayLen) { ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
21.07.2013, 17:29 #46
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
Спасибо! Понятно.
Не за что. Когда "пережуёте" прямой код, товарищи правильно сказали, что он не актуален, почитайте про обратный.
Я пояснил на примере прямого кода потому что сам когда-то это учил и зная как всё происходит в прямом, проще было разобраться с обратным, но на самом деле он может Вам даже не пригодиться, ну мне ещё не пригодился)
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
21.07.2013, 17:30 #47
Цитата Сообщение от Retyrn0 Посмотреть сообщение
в пятибитной
ну так сложи мне в своей пятибитной
-9+9=0
11001+01001=?

Добавлено через 1 минуту
Цитата Сообщение от Retyrn0 Посмотреть сообщение
Когда "пережуёте" прямой код, товарищи правильно сказали, что он не актуален,
и кто это заявлял?
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
21.07.2013, 17:43 #48
Цитата Сообщение от ValeryS Посмотреть сообщение
сложи мне в своей пятибитной
Цитата Сообщение от ValeryS Посмотреть сообщение
-9
Это вычитание, а не сложение, если что ;-)
Покажите мне строчку в вопросе ТС где фигурирует слово "сложение" или "вычитание"?
Вот там да, одним прямым кодом не обойтись. А Ваш пример-задача - там да, хитрыми манипуляциями вычитание превращается в сложение ;-)
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
21.07.2013, 17:55 #49
Dimka-novitsek, тебе со сдвигом то все понятно или еще что объяснить?
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
21.07.2013, 17:58 #50
ValeryS, кстати, у меня вопрос не по теме, а данные именно хранятся в обратном коде или переводятся в него во время выполнения операций?
Dimka-novitsek
14 / 14 / 0
Регистрация: 26.04.2012
Сообщений: 1,091
21.07.2013, 17:59  [ТС] #51
Понятно!! Спасибо!!!
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
21.07.2013, 18:41 #52
Цитата Сообщение от Retyrn0 Посмотреть сообщение
данные именно хранятся в обратном коде или переводятся в него во время выполнения операций?
данные хранятся так же как и используются
все знакомые мне процессоры хранят положительные в прямом, отрицательные в дополнительном коде
у звуковых процессоров несколько иная картина(про те что я знаю)
отрицательные числа от 0 до 01111111(зависит от разрядности процессора ) 10000000 "0" дальше положительные значения связано это с работой АЦП ЦАП
но может быть и по другому, я просто не в курсе
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
21.07.2013, 19:27 #53
Цитата Сообщение от ValeryS Посмотреть сообщение
отрицательные числа от 0 до 01111111(зависит от разрядности процессора ) 10000000 "0" дальше положительные значения
Спасибо за разъяснения. А при вычитании unsigned чисел, вычитаемое нуждается же в преобразовании вроде?
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
21.07.2013, 20:03 #54
Цитата Сообщение от Retyrn0 Посмотреть сообщение
А при вычитании unsigned чисел, вычитаемое нуждается же в преобразовании вроде?
нет
у ассемблера (сиречь машинного кода ) есть команда для сложения ADD и вычитания SUB
Хотя в самом процессоре может и преобразуется,зависит от инженеров как они реализовали SUB
да и процессор не знает такого знаковый беззнаковый, он знает просто числа
рассмотрим пример
безнаковое сложение
255(FF) +1 (1)=1 00 т.е получился 0 и перенос в старший разряд, которого нет, переполнение разрядной сетки
т.е на языке Си это будет примерно так
(255+1)%256
теперь знаковое
-1(FF)+1(1)=1 00 тоже самое переполнение

теперь вычитание
255(FF)-1(1)=254(FE)
-1(FF)-1(1)=-2(FE)
как видишь никакой разницы в шестнадцатеричных значениях нет
и процессору они не нужны
это уже прерогатива языков высокого уровня ,при программировании на ассемблере программиста,
как интерпретировать числа с установленным старшим разрядом, как знаковое или как беззнаковое
кстати для знаковых возможны колизии которые нужно учитывать
C++
1
2
char a=127;
a++;// а стало -128
переполнение
чтобы этого не было нужно проверять результат
например
C++
1
2
3
4
5
char a=100;
char b= 100;
if(a+b<a)
  return error;
return a+b;
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
21.07.2013, 20:18 #55
Цитата Сообщение от ValeryS Посмотреть сообщение
чтобы этого не было нужно проверять результат
Ну это само собой разумеется. Спасибо!
Thinker
Эксперт C++
4225 / 2199 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
21.07.2013, 20:55 #56
Цитата Сообщение от Retyrn0 Посмотреть сообщение
Я с удовольствием последую Вашему совету, если Вы объясните где я не прав-то?
смотрите. рассмотрим 4-х разрядные числа:

-8 1000
-7 1001
-6 1010
-5 1011
-4 1100
-3 1101
-2 1110
-1 1111

1100 >> 2 по сути это деление на 4.
-4 / 4 = -1 == 1111
стало понятнее?
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
21.07.2013, 21:08 #57
Цитата Сообщение от Thinker Посмотреть сообщение
стало понятнее?
Это было понятно давно. как это относиться к сдвигу прямого кода, который я объяснял ТС?
В вопросе была фраза "как компьютер производит двоичный сдвиг"? Или ему нужно было понять что делают операторы "<<" и ">>"? Я уже много раз проверил своё объяснение на программе - ни одного противоречия не возникло. каждое моё утверждение выполняется на реальном компьютере. На примере прямого кода сдвиг объяснить значительно проще и понятнее ИМХО, что и стало причиной данного спора. В своё время ТС, при необходимости, узнает о массе вещей, которые используются в реальных компьютерах, а сейчас ему это знать не нужно. Я по себе знаю как это, когда "умные дядьки" рассказывают простые вещи сложным языком и мне такой подход крайне не нравился. Сейчас я упростил объяснение. Какие вопросы?
Thinker
Эксперт C++
4225 / 2199 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
21.07.2013, 21:10 #58
Цитата Сообщение от Retyrn0 Посмотреть сообщение
Это было понятно давно.
это был комментарий к этому
Цитата Сообщение от Retyrn0 Посмотреть сообщение
Да ладно? Разве?

1100>>2=1001
сообщению.

Не по теме:

отлучался, сразу не мог написать

Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
21.07.2013, 21:19 #59
Цитата Сообщение от Thinker Посмотреть сообщение
это был комментарий к этому
Сообщение от Retyrn0
Да ладно? Разве?
1100>>2=1001
сообщению.
Извиняюсь, я не догадался сразу, что это не прямой код. У меня есть отмазка - я не экстрасенс =)
Thinker
Эксперт C++
4225 / 2199 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
21.07.2013, 21:21 #60
Цитата Сообщение от Retyrn0 Посмотреть сообщение
я не догадался сразу, что это не прямой код.

Не по теме:

ну, тогда все точки над и расставлены.

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.07.2013, 21:21
Привет! Вот еще темы с ответами:

Нюансы синтаксиса: объяснить как работает тернарная операция в заданном фрагменте кода - C++
Всем доброго времени суток! Помогите разобраться с кодом. const char x = {&quot;Jason &quot;, &quot;at your service\n&quot;}; const char * y =...

Обьясните почему не работает - C++
Я новичек, помогите разобраться. #include &lt;iostream&gt; #include &lt;windows.h&gt; #include &lt;ctime&gt; #include &lt;iomanip&gt; using namespace...

Как работает операция взятия адреса "&"? - C++
В каждой переменной есть адрес,так вот,когда операция взятия адреса берёт адрес,она его копирует?И тогда адрес остаётся в переменной и в...

Странно работает тернарная операция - C++
Доброй ночи... if((i == 3)?(!(*BoolHash)):((*BoolHash))) cout &lt;&lt; &quot;\nError\n&quot;; else {// Выполнение функции} Если i = 1 или 2...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
21.07.2013, 21:21
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru