![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
marina12 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 15.2.2013 Репутация: нет Всего: нет |
Задание - написать программу,которая переводила бы число типа unsigned char из десятичной СС в двоичную. Начала писать, используя операцию побитового сдвига, но программа работает неверно, в результате выдаёт неправильное число + в десятичной системе. Подскажите пожалуйста, в чем ошибка!
|
|||
|
||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 2 Всего: 9 |
(c<<i)>>7 не изменяет с, попробуйте внести это выражение в printf вместо c
|
|||
|
||||
marina12 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 15.2.2013 Репутация: нет Всего: нет |
Не выходит, всё равно выдает длинное число... |
|||
|
||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 2 Всего: 9 |
scanf("%c",&a); читает код символа. попробуйте изменить строку с=a, на c=a-'0';
Это сообщение отредактировал(а) Albor - 15.2.2013, 14:24 |
|||
|
||||
IValdemar |
|
||||||||
![]() Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 10.1.2012 Репутация: нет Всего: нет |
Я не очень понимаю как вы собираетесь десятизначное(!) число записать в один символ ![]()
Я так понимаю число должно быть 0..9. Тогда достаточно просто представить его в двоичном виде Здесь в "с" запишется номер символа. Надо так с=a-'0'; собственно об этом уже написали выше. Далее: Чего вы пытались добиться этой строкой? Вот так будет правильно:
Чтобы корректно выводилось надо булевую переменную. Но учтите что так:
Вводится только один символ. PS И счетчик лучше пустить сверху вниз. |
||||||||
|
|||||||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 2 Всего: 9 |
Чтобы корректно выводилось, нужно разобраться как работает конструкция (c<<i)>>7, дизассемблировав код этой конструкции. А получается вот что: число у нас 8-разрядное, а регистры процессора - 32(64), поэтому, сдвинув влево число, его старшие разряды не выпадают, а остаются в регистре, следующий сдвиг вправо на 7 разрядов "подсовывает" ненужные разряды и получается результат отличный от 0 и 1, поэтому ещё нужно фильтровать операцией И. Либо, разделить конструкцию на 2 отдельных:
Здесь, в промежутке между сдвигами, результат записывается из регистра в память, поэтому лишние разряды выпадают и результат будет правильный без "фильтрующей" И |
|||
|
||||
IValdemar |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 10.1.2012 Репутация: нет Всего: нет |
Albor, Это было сказано не касательно выражения (c<<i)>>7, а касательно выражения (c&(1<<(7-i)) или ((c<<i)>>7)&1) результат которых имеет тип bool
|
|||
|
||||
winst2014 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 19.2.2013 Репутация: нет Всего: нет |
Это сообщение отредактировал(а) winst2014 - 19.2.2013, 07:49 |
|||
|
||||
Albor |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 2 Всего: 9 |
Я не возражаю. ТС теоретически рассчитал правильно, вытолкнув лишние разряды влево/вправо, но допустил несколько ошибок из-за которых результат был не верный. На счёт типа bool у меня возражение, чисто логическое: а почему не char или unsigned char? bool - это true или false, а нам нужны 0 и 1, если false это 0, то true - не 0, т.е. не обязательно 1
Это сообщение отредактировал(а) Albor - 19.2.2013, 11:28 |
||||
|
|||||
IValdemar |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 10.1.2012 Репутация: нет Всего: нет |
Согласен, я просто перепутал побитовое и логическое "И" ![]() Для корректного вывода моего примера в printf нужен bool. Так как значением выражения (c&(1<<(7-i)) может быть не 1 или 0, а в выражении ((c<<i)>>7)&1) будет 1 или 0. ![]() |
|||
|
||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 2 Всего: 9 |
Я не уверен на все 100, что это "прокатит" на всех компиляторах. VS генерит код, жестко подставляя 1 вместо true при инициализации переменной или при вычислении выражения, даже если определить true отличным от 1: #define true 255, например (если только не #define true false ![]() |
|||
|
||||
korian |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: 2 Всего: 17 |
по стандарту - любое не нулевое число в сравнительных выражения - это истина true - это всегда единица И по большому счету в этом коде bool'а тоже нету. (я не уверен, но кажись не гарантируется, что там будет 0 или 1). f = (c&(1<<(7-i))) != 0; - вот так вот будет bool. (т.е. в f будет 0 или 1 - 100%, по стандарту). А выводит оно все равно не bool, а int, и разворачивает его до размера инта перед выводом. Это сообщение отредактировал(а) korian - 20.2.2013, 14:02 |
|||
|
||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 2 Всего: 9 |
Здесь идёт преобразование к bool. Вот что говорит стандарт:
То есть, результат будет преобразован в true если он не равен 0. Получается что не так уж много криминала в коде IValdemar. С другой стороны, по моему мнению, true - весьма скользкая вещь, например выражение if(val==false) всегда сработает правильно, чего не скажешь о выражении if(val==true). В дизассемблере видно, что проверка идёт по результату операции только на 0, то есть, закончилась ли операция нулевым результатом и, фактически результат - это бит в флаговом регистре, который м.б. только 0 или 1. Это сообщение отредактировал(а) Albor - 21.2.2013, 08:39 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |