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

может кто расскажет про биты? - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.83
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
25.08.2011, 13:25     может кто расскажет про биты? #1
вопрос
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
25.08.2011, 13:59     может кто расскажет про биты? #2
Из вопроса не понятно, что конкретно нужно рассказать про биты.
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
25.08.2011, 14:11  [ТС]     может кто расскажет про биты? #3
например поток берет 1 в чаре. что при этом происходит? 00000001? 00110001?(49)
или поток берет 32 битный инт. тут идет 00000000 00000000 00000000 00000001?
Я думаю что char обрабатывается быстрее ввиду своего размера, но....хотелось бы уточнить



Цитата Сообщение от iama Посмотреть сообщение
Потоки в стиле Си всегда быстрее потоков в стиле Си++
Что легче читать - 32-битный инт, который из символов нужно привести к числу в двоичной записи, или просто сам символ, не выполняя над ним никаких преобразований, а программист сам получает ответ - ноль это или единица, вычитая из полученого символа - '0'?
что значит фраза "сам символ, не выполняя над ним преобразований"
вопрос. как обрабатывается переменная типа char? в каком виде попадает в поток?
в поток уходит битовое представление цифрового значения чара из таблицы символов?
может вот так тогда?
char a = '1'; (49) 00110001?
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
25.08.2011, 14:21     может кто расскажет про биты? #4
Цитата Сообщение от AzaKendler Посмотреть сообщение
что значит фраза "сам символ, не выполняя над ним преобразований"
scanf\cin всегда считывают текст (char), и потом, если это нужно, и если это возможно, преобразует его в другой тип (int, float, и т.д.).
Также как и printf\cout, если им подаются в качестве параметров не символьные типы данных, сначала преобразует эти данные в текст, и тольк потом помещает их в поток.
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
25.08.2011, 14:27  [ТС]     может кто расскажет про биты? #5
понял. ну и в итоге чар будет чаром и далее будет (49) 00110001.
а 32 битный инт. вначале преобразуется в чар и далее в нечто

4848484848484848 4848484848484848 4848484848484848 4848484848484849

00110000 00110000 00110000 00110000 00110000 00110000 00110000 00110000
00110000 00110000 00110000 00110000 00110000 00110000 00110000 00110000
00110000 00110000 00110000 00110000 00110000 00110000 00110000 00110000
00110000 00110000 00110000 00110000 00110000 00110000 00110000 00110001


теперь все стало на свои места (или нет? инт заполнен нулями?)

Добавлено через 1 минуту
kazak, спасибо за подробную расшифровку. возможно когда буду читать про потоки там это все(про формат считывания) будет написано (надеюсь на это)
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
25.08.2011, 15:37     может кто расскажет про биты? #6
Цитата Сообщение от AzaKendler Посмотреть сообщение
а 32 битный инт. вначале преобразуется в чар и далее в нечто
Когда? При вводе из потока или при выводе в поток?

Добавлено через 5 минут
В этом случае советую думать не битами, а байтами:

C++
1
2
char buffer[8];
cin >> buffer;
вводим: hello[ENTER]
после ввода char buffer[8] содержит: 68 65 6C 6C 6F 00 00 00 00

C++
1
2
int number;
cin >> number;
вводим: 315[ENTER]
после ввода сначала есть некая (внутренняя строка), 33 31 35 00 00 00 00 ... , которая потом преобразуется в четырёхбайтовый int: 00 00 01 3B
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
25.08.2011, 16:18  [ТС]     может кто расскажет про биты? #7
talis, ну в итоге все преобразуется в двоичную систему, разве нет?
Цитата Сообщение от talis Посмотреть сообщение
далее в нечто
это я имел ввиду двоичную систему, понятную мащине.
LosAngeles
Заблокирован
25.08.2011, 16:25     может кто расскажет про биты? #8
всё и так в двоичной, куда переводить то?
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
25.08.2011, 16:32     может кто расскажет про биты? #9
AzaKendler, да, в машине всё хранится в двоичной системе, однако минимальный адресуемый участок памяти - это байт. К тому же, проще оценить число в виде 0x1B35, чем 1101100110101, согласитесь

Символы в машине хранятся в виде чисел. Например, символ пробела - 0x20, символ 'A' - 0x41, символ '0' - 0x30, символ '2' - 0x32. То есть строка "abba 1972" будет выглядеть в памяти как

61 62 62 61 20 31 39 37 32 00

Если записать в шестнадцатеричной системе, разумеется.

Но число 1972, которое тут выглядит как 31 39 37 32, гораздо экономичнее и удобнее хранить как 07 B4 - и места меньше занимает, и в те же 4 байта можно вместить гораздо больше чисел, и математические операции в таком виде проще. По-этому строки хранят как последовательность символов, а числа (если они не часть строки) - в соответствующем числовом формате, будь то целочисленный знаковый/беззнаковый разных размеров, с плавающей точкой и так далее.
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
25.08.2011, 17:16  [ТС]     может кто расскажет про биты? #10
talis, ну т.е. это только для нашего удобства-понимания, верно? машина все равно нолики-единички думает?
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
25.08.2011, 17:32     может кто расскажет про биты? #11
Цитата Сообщение от AzaKendler Посмотреть сообщение
ну т.е. это только для нашего удобства-понимания, верно? машина все равно нолики-единички думает?


Если уж на то пошло, читайте про триггеры. Хотя бы на википедии. Для начала будет достаточно.
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
25.08.2011, 17:49     может кто расскажет про биты? #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
AzaKendler, в теории - да. Реально размер регистра общего назначения в x86 - 32 бита, и очень многие операции над числами делаются в один такт процессора, так что в этом случае она думает двойными-словами (слово - 2 байта, двойное - 4). Если брать SSE и его развитие то там вообще за один такт выполняются операции над четырёхмерными векторами float (считайте: 1 float - 32 бита, 4 float - 128 бит один регистр SSE).

Streaming SMID Extensions

Так что сказать, что компьютер думает ноликами и единичками - это только небольшая часть истины. На самом низком аппаратном уровне - да. А так вообще всё гораздо интереснее
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
25.08.2011, 18:42     может кто расскажет про биты? #13
ну т.е. это только для нашего удобства-понимания, верно? машина все равно нолики-единички думает?
Машина не думает. Принимает конкретные электрические сигналы, условно обозначаемые {1,0}, и это речь не идет об аналоговых устройствах, а конкретно дискретные, т.е. те на которых базируется ПК, нотебук, ..., и много еще чего О_о. ИМХО (может я и не прав) вопрос некорректен с той точки зрения, что не определен уровень взаимодействия. Если спуститься "в самый низ" на физический, то конечно это двоичные вектора, ниже - дискретные устройства (регистры, триггеры, коммутаторы, ИМС, ПЛМ), ниже - транзисторы, тиристоры, резисторы, ниже - электрический потенциал в цепи (-0,5В -логический нуль, -0,8В - логическая единица для отрицательной логики и 0,8В - логический нуль, 0,5В - логическая единица для положительной логики). Видя шестнадцатеричный вектор в мониторе, конечно была проделана уйма команд, чтобы в мониторе в определенной последовательности открылся\закрылся ряд транзисторов и повернулись кристаллы опять же определенным образом, ну и конечно для этого сначала надо вычесть какой именно вектор подать в шину. Если интересно то думаю что на многое прольет свет.
 Комментарий модератора 
Ссылки в личку!

Если это сильно "низко" то смотри как работает компилятор и все станет ясно, я лично не знаю, но пока и не возникало неообходимости.
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
25.08.2011, 20:14  [ТС]     может кто расскажет про биты? #14
ужос. столько полезной инфы накидали. спасибо надо прочесть.
а про нолики и единички это я к тому что в той теме шла речь о том что гризлик показал свой вариант и он оказался быстрее чем просто с инт в разы. вот мне и стало интересно а почему? Подумалось из за размера. А потом подсказали что оказывается поток по умолчанию берет символы. т.е. если мы подаем на него 32битный (4х байтный инт) то он переводится в символьное представление и на это расходуется время. вот я и прикинул что получится если в итоге в двоичной системе окажется символ 1 или инт 1. и накидал ноликов и единичек. И получилось в случае с интом монстроподобная конструкция, это (мне) наглядно показало что значит сие преобразование. Спасибо парни огромное за кучу полезных ссылок мне как раз очень интересно железо и как все работает.

вот вопрос. инт забит нулями чтобы зарезервировать размер?

Добавлено через 1 минуту
alkagolik, нет на самый низ не планировалось. планировалось в этом случае ограничиться информационным преднизьем. насколько получилось уж незнаю

Добавлено через 2 минуты
Цитата Сообщение от fasked Посмотреть сообщение
ну т.е. это только для нашего удобства-понимания, верно? машина все равно нолики-единички думает?
наверно написав так я вызвал не совсем правильную реакцию. буду следить за речью впредь
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
25.08.2011, 20:16     может кто расскажет про биты? #15
Цитата Сообщение от AzaKendler Посмотреть сообщение
вот вопрос. инт забит нулями чтобы зарезервировать размер?
Размер резервируется вне зависимости от содержимого переменной. Обычно компиляторы инициализируют int нулём, то есть при создании ему автоматически присваивается ноль, однако рекомендуется не полагаться на такое поведение и инициализировать переменные самостоятельно:

C
1
int i = 0;
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
25.08.2011, 20:24  [ТС]     может кто расскажет про биты? #16
talis, я имел ввиду следующее. если я присваиваю инту значение 1. все остальное место занимают нули?
0000000000000000001 (примерно так??). чтобы зарезервировать именно память под него - забито ли остальное место до 32 бит нулями?
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
25.08.2011, 20:25     может кто расскажет про биты? #17
Цитата Сообщение от talis Посмотреть сообщение
Обычно компиляторы инициализируют int нулём
Это какие, например?
P.S. если переменную объявить в глобальной области, то она инициализируется нулем.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
25.08.2011, 20:26     может кто расскажет про биты? #18
Цитата Сообщение от talis Посмотреть сообщение
Обычно компиляторы инициализируют int нулём, то есть при создании ему автоматически присваивается ноль
Обычно компиляторы как раз этого не делают. То есть если просто объвить int, то в ней будет мусор, который находился ранее в этом участке памяти.

Добавлено через 54 секунды
Цитата Сообщение от AzaKendler Посмотреть сообщение
если я присваиваю инту значение 1. все остальное место занимают нули?
0000000000000000001 (примерно так??).
Так. Но это не значит, что компилятор что-то где-то резервирует или забивает. Это просто представление единицы в двоичном виде.
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
25.08.2011, 20:28  [ТС]     может кто расскажет про биты? #19
fasked, спасибо подтвердил мои мысли. Значит я все верно расписал.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.08.2011, 20:31     может кто расскажет про биты?
Еще ссылки по теме:

обьясните кто может C++
C++ Задача про биты
C++ Ввести целое число A. Инвертировать все биты с 4 по 8, включая эти биты. Вывести результат

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

Или воспользуйтесь поиском по форуму:
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
25.08.2011, 20:31     может кто расскажет про биты? #20
Цитата Сообщение от AzaKendler Посмотреть сообщение
talis, я имел ввиду следующее. если я присваиваю инту значение 1. все остальное место занимают нули?
0000000000000000001 (примерно так??).
AzaKendler, в общем и целом, да. Ведь 0x00000001 == 0x1 :-)

Добавлено через 54 секунды

Не по теме:

Опоздал ответить...

Yandex
Объявления
25.08.2011, 20:31     может кто расскажет про биты?
Ответ Создать тему
Опции темы

Текущее время: 00:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru