![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Автору темы нужно было реализовать ПРЯМОЕ представление числа, а в компьютере используется ДОПОЛНИТЕЛЬНОЕ. Очевидно, что арифметику над этим ПРЯМЫМ представлением ему придется писать самому, 'простой оператор минус' расчитан на ДОПОЛНИТЕЛЬНОЕ. Но в его случае ему всеравно придется писать арифметику самому, так как у него будет арифметика с числами произвольной длинны (не 32 бита).
Кстати, в его случае имело бы смысл вообще хранить знак отдельно (не в старшем бите). |
||||
|
|||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Ripper
возможно, ты имеешь в виду, что у тебя нет ограничений на разрядность числа? Тогда действительно проще держать модуль числа и знак отдельным полем. |
|||
|
||||
| Ripper |
|
|||
![]() Lonely soul... ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 30.6.2004 Где: г. Москва Репутация: нет Всего: 23 |
Хорошо, пользователь ввел строку (массив чаров) равную 8AB. Что должно быть в классе в массиве том?
Вот число которое в африке число... и неважно в какой оно системе - ну и чего По мне так как я понял нужно 8АБ представить в двоичном, и записать в массив чаров - это будет прямой код, потом если первая цифра 1 то его инвертировать и прибавить еденицу. Получить дополнительный код. А потом сложение вычитание реализовать Тока я пока не особо представляю как я это все сделаю, например 1)Разрядная сетка это sizeof(int)*8? 2)допустим два байта 16 бит а число AB в шестадцатеричной. значит 0000 0000 1010 1011 ? А какую тогда цифру вообще проверять, вот 00000000010101011 это записано будет в массиве, но как определить что есть первая. Или наверно нафиг ненужно нули писать. А если ввести AAAAAA то типа переполнение ? Нет, все равно тупик))) Добавлено через 4 минуты и 51 секунду 1A - 0001 1010 - что здесь старший бит? [0]001 1010 A1 - 1010 0001 а здесь [1]010 0001. Т.е. это отрицательное число с модулем 1010 0001 ? -------------------- "Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Ripper, ты сначала определись, что именно вводит пользователь. Если он может вводить -8AB и 8AB, то тебе нужно в дополнительный код переводить только число с минусом.
|
|||
|
||||
| Ripper |
|
|||
![]() Lonely soul... ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 30.6.2004 Где: г. Москва Репутация: нет Всего: 23 |
Да вроде не сказано в задании как вводить. сказано перегрузить >> <<. Но ведь тут говорят что нет такого понятия как отрицательное число для 8AB. оно отрицательно если первая цифра больше 7.
Вводить как я понял нужно числа не указывая явно знак. Тогда что должно быть в массиве в классе, если введены 1А и А1. что здесь будет модулем а что знаком? -------------------- "Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом |
|||
|
||||
| powerfox |
|
||||
![]() I wanna fork() ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3990 Регистрация: 1.10.2005 Где: Санкт-Петербург Репутация: 2 Всего: 97 |
Что значит прямое?
Вспомнилась сказка про белого бычка. Тут уже не раз прозвучало. Что есть 2 варианта работы с числом: 1. Хранить его в виде int. Все операции для такого числа есть. Лишь написать функции для представления его в формате, который требует условие (массив char). Вот и всё. Настраиваем, чтобы cout выводила числа в формате hex, выводим в буфер и читаем по цифре в массив. Задание выполнено. 2. Сами реализуем класс и соответствующие операции (в условии я нашёл только сложение), но нам также нужно преобразование в доп. код. Можно реализовать оператор побитового оператора и сложения с int (для приьавления единицы). Неограниченная длина - делаем вектор char и поле класса, которое хранит разрядность. Ничего такого, чтобы спорить. Задание можно понять немного по разному, а реализовать - так вообще множество вариантов. Добавлено через 3 минуты и 14 секунд Что-то лень читать особо. Но что за навороты пошли с модулем и числом по отдельности? Всю жизнь число было "единым". Просто определённые разряды интерпретироваться могут по-разному. И зачем тут понятие модуля, если числа целые. Знаковый разряд и само число (модуль числа). Ввоидится вместе. Ripper, ты получаешь всё число, но проверяешь старший разрад (чтобы узнать знак числа). |
||||
|
|||||
| powerfox |
|
|||
![]() I wanna fork() ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3990 Регистрация: 1.10.2005 Где: Санкт-Петербург Репутация: 2 Всего: 97 |
||||
|
||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Почему то мне кажется, что от вас хотят получить представление с явным знаком, т.е. или '8AB' (положительное) или '-8AB' (отричательное) и не заниматься никакими интерпретациями никаких старших битов
|
||||
|
|||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
зачем хранить знак? Ripper по разрядности числа лимитированы или нет? если лимитированы (допустим, 32 разряда) хранить нужно int а потом в зависимости от представления, которое нужно получить, преобразовывать этот int -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
При внимательном изучении первого поста можно сделать выводы: 1) Разрядность лимитированна и много больше, чем 32 бита (int не подойдет) 2) Входные данные представленны в ПРЯМОМ коде (читай - с отдельным знаком), при выполнении операций нужно использовать ДОПОЛНИТЕЛЬНЫЙ код - т.е. имеет смысл данные в конструкторе конвертировать в бинарный дополнительный код и именно в таком виде и хранить (в током случае отдельный знак, как я предлагал ранее, не нужен) |
|||
|
||||
| Ripper |
|
|||
![]() Lonely soul... ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 30.6.2004 Где: г. Москва Репутация: нет Всего: 23 |
Так. Ещё раз. 16ричное число определяется его длиной (количество цифр в числе, например, до 31) и массивом значений 16ричных цифр (типа char). Число со знаком хранится в прямом коде.
Так что хранить в моем массиве, с одной стороны это массив значений 16ричных чисел. А где хранить прямой код? Тока не говорите что числа везде одни и теже и прямой код один и тотже. Прямой код нужно в двоичном представлении хранить как я понимаю. и ещё вопросик
Как эта ф-ия работает? Извините, мне сложно на си переходить с др. языка, поэтому туго осваиваюсь. return "1111" это что, это разве указатель на тип чар? И как её потом использовать, пользователь вводит строку (массив char-ов) в виде 1FF (т.е. hex число) и мне нужно в другой массив записать это дело в 2 коде... Тока я так и не понял что туда писать :( -------------------- "Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Зачем тебе двоичный? У тебя в ТЗ про двоичное ничего не сказано. Храни только прямой код и знак, который будешь учитывать при арифметических операциях.
|
|||
|
||||
| Ripper |
|
|||
![]() Lonely soul... ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 30.6.2004 Где: г. Москва Репутация: нет Всего: 23 |
И как узнать старший бит? Блин.
В самом hex числе уже зашит знак. А как тогда производить действия в дополнительном коде? Я незнаю что такое дополнительный код в 16ричном виде. пользователь вводит FF+2A 1111 1111 + 00101010. Беремь инвертируем и единицу добавляем 0000 0001 11010101 и складываем. Ну что то в этом роде. Ну разве не так? Пользователь не должен вводить "+FF" - "-FBA" -------------------- "Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом |
|||
|
||||
| xvr |
|
||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Не надо хранить число внутри класса в hex виде - храни в бинарном. В задании сказано только про ввод/вывод числа в hex - это не значит, что и внутри должен быть hex И старший бит тебе не нужен - арифметика (+/-) делается буз учета старшего бита.
В шестнадцатиричном просили прямой код т.е. FF+2A это сумма двух ПОЛОЖИТЕЛЬНЫХ чисел
Нет, просто складываем 1111 1111 + 00101010 (предполагается, что длинна чисел более 8ми битов, иначе в исходных числах ошибка - FF не представимо в виде 8ми битного числа со знаком)
Пользователь МОЖЕТ вводить "+FF", и ДОЛЖЕН вводить "-2A" |
||||||||
|
|||||||||
| Ripper |
|
|||
![]() Lonely soul... ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 30.6.2004 Где: г. Москва Репутация: нет Всего: 23 |
xvr, Завтра спрошу у препода. я уже незнаю чему верить
-2A - для шестнадцатеричных числе не определно понятие отрицательное число (гдето выше писали) т.к. первый бит указывает на знак значит ненужно вводить знак явно. -------------------- "Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |