Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Класс - шестнадцатеричное число


Автор: Ripper 1.11.2007, 16:05
16ричное число определяется его длиной (количество цифр в числе) и массивом значений 16ричных цифр(типа char). Число со знаком хранится в прямом коде. При выполнении арифметических операций использовать дополнительный код. Память под массив выделяется статически, во время компиляции и задается массивом фиксированного размера
Нужно сделать 3 конструктора, пустой, с hex константой и строкой символов.

Подскажите, как перевести число которое я передам в конструктор в двоичное, и самое главное - в прямой код как. Вообще странно, написано что есть массив значений ШЕСТНАДЦАТЕРИЧНЫХ цифр (char массив), но прямой код подразумевает единицы и нули? 
Как вообще учитывается знак в таком случае? Т.е. hex(0xABCFD) - чему это число равно в прямом коде? Вот -5, 10, 15 я знаю чему равно, а тут же беззнаковая константа или как? Мне говорили что можно считать что знак задан в самом числе, т.е. ABCDF перевести в двоичное и первая цифра знак - но я чето совсем не понимаю о чем речь, ведь тогда число теряется...

Вообщем можете привести пример, например создать 2 класса и сложить их (ну там перегрузить + - надо будет ещё). Меня именно эти коды угнетают  smile 

Автор: Lazin 1.11.2007, 16:24
Цитата(Ripper @  1.11.2007,  16:05 Найти цитируемый пост)
Как вообще учитывается знак в таком случае? Т.е. hex(0xABCFD) - чему это число равно в прямом коде? Вот -5, 10, 15 я знаю чему равно, а тут же беззнаковая константа или как? Мне говорили что можно считать что знак задан в самом числе, т.е. ABCDF перевести в двоичное и первая цифра знак - но я чето совсем не понимаю о чем речь, ведь тогда число теряется...

Если старший бит равен 1 то число отрицательное, т.е. если старший разряд больше 7 - число отрицательное.

Автор: GIK 1.11.2007, 16:29
Цитата

Подскажите, как перевести число которое я передам в конструктор в двоичное, и самое главное - в прямой код как. Вообще странно, написано что есть массив значений ШЕСТНАДЦАТЕРИЧНЫХ цифр (char массив), но прямой код подразумевает единицы и нули? 
Как вообще учитывается знак в таком случае? Т.е. hex(0xABCFD) - чему это число равно в прямом коде?


Думаю, что можно за счет длины шестнадцатиричного значения, можно легко вычислить цифровое значение, простым деление, а потом его в двоичное переконвертить, хотя наверника лекго можно и сразу, но толкьо как???  smile 

Автор: zkv 1.11.2007, 16:36
Цитата(Ripper @  1.11.2007,  16:05 Найти цитируемый пост)
прямой код подразумевает единицы и нули?

нет он говорит о том, что из себя представляет набор бит. те неважно в каком виде мы его представим на бумаге, набор битов все равно тот же останется.
важно, что эти биты значат вот представление числа и дает нам эту информацию
Цитата(Ripper @  1.11.2007,  16:05 Найти цитируемый пост)
Т.е. hex(0xABCFD) - чему это число равно в прямом коде?

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

http://ru.wikipedia.org/wiki/%D0%94%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%B4_(%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%87%D0%B8%D1%81%D0%BB%D0%B0)
погугли, подтяни теорию.
http://www.dstu.edu.ru/informatics/mtdss/part2.html неплохая на первый взгляд

Добавлено @ 16:42
Цитата(GIK @  1.11.2007,  16:29 Найти цитируемый пост)
Думаю, что можно за счет длины шестнадцатиричного значения, можно легко вычислить цифровое значение, простым деление, а потом его в двоичное переконвертить, хотя наверника лекго можно и сразу, но толкьо как???

шестнадцатиричное в двоичное переводится простой заменой 1 hex цифры 4 bin цифрами:
Код

static const char *HexDigitToBinNumber( char dig )
{
    switch( dig )
    {
    case '0': return "0000";
    case '1': return "0001";
    case '2': return "0010";
    case '3': return "0011";
    case '4': return "0100";
    case '5': return "0101";
    case '6': return "0110";
    case '7': return "0111";
    case '8': return "1000";
    case '9': return "1001";
    case 'A': return "1010";
    case 'B': return "1011";
    case 'C': return "1100";
    case 'D': return "1101";
    case 'E': return "1110";
    case 'F': return "1111";
    }
    return "";
}
 

Автор: Ripper 1.11.2007, 18:05
Все равно не пойму. Если я переведу 16ричное число в двоичное я получу прямой код? 
Цитата

Прямой код. Прямой код двоичного числа совпадает по изображению с записью самого числа. Значение знакового разряда для положительных чисел равно 0, а для отрицательных чисел 1.


Прямой код FFF не равен FFF же. Т.е. нужно перевести в двоичное. И я уже получу вместе со знаковым разрядом ?
Странно, почему тогда мы не говорим что числа 864 отрицательное или какое там, судя по первому разряду?  А только для шестнадцатеричных? 

F = 1111, получается 1.111 но это уже другое число, когда мы 1 бит под знак берем число же меняется
Цитата

Пример. В случае, когда для записи кода выделен один байт, для числа +1101 прямой код 0,0001101, для числа -1101 прямой код 1,0001101.

А если число без знака задано, как я его в прямой код запишу. Там конструктор с 16ричной константой... 

Щас прочту полностью ссылки, но просто мы когда то это проходили сквозь пальцы, и везде помню указывался знак. Для меня эти коды муть. Особенно что число FFF отрицательное, а 111 положительное. А как сделать положительное число записанное в десятичной системе как 255 - шестнадцатеричным если fff отрицательное.. ерунда ) 

Автор: zkv 1.11.2007, 20:01
Ripper, ты не понял smile
Цитата(Ripper @  1.11.2007,  18:05 Найти цитируемый пост)
Если я переведу 16ричное число в двоичное я получу прямой код? 

НЕ ВАЖНО в какой системе число, значение его не меняется.
Какая разница как ты запишешь: 12(dec) или С(hex) или 1100(bin). К примеру ты пересчитаешь баранов в двоичной системе счисления, а потом в десятичной, их количество от этого не изменится, верно?  smile 
Просто когда описывают хранение чисел в ячейках памяти, удобнее объяснять в двоичной системе. Шестнадцатиричная удобна тем, что запись числа краткая и число можно не напрягаясь в уме конвертнуть в двоичную систему. С десятичной понятно.
Уяснили, в какой бы системе число не представили суть его не меняется.

Цитата(Ripper @  1.11.2007,  18:05 Найти цитируемый пост)
Прямой код FFF не равен FFF же.

это неверное утверждение в общем случае. 
FFF(hex) == 1111 1111 1111(bin), все будет зависеть от разрядной сетки (ее размера)
допустим числа у нас хранятся в доп. коде.
1. допустим у нас число представлено 16 битами,  получается, что для хранения значения числа мы используем 14 бит, а 2 для знака и контроля переполнения. в этом случае FFF означает:
0000 1111 1111 1111 - впереди 2 нуля -> доп. код равен прямому коду - в прямом коде, и равен 2^12 - 1 в десятичной системе.
2. допустим у нас число представлено 12 битами,  получается, что для хранения значения числа мы используем 10 бит, а 2 для знака и контроля переполнения. в этом случае FFF означает:
1111 1111 1111 - впереди 2 единицы - это отрицательное число, можешь самостоятельно перевести его в обратный и прямой коды (алгоритмы имеются), можешь найти его десятичное представление (мне что-то не хочется считать  smile), помним, суть числа от перевода не изменится, сколько баранов оно обозначало, столько и будет обозначать дальше.
3. допустим у нас число представлено 13 битами,  получается, что для хранения значения числа мы используем 11 бит, а 2 для знака и контроля переполнения. в этом случае FFF означает:
0 1111 1111 1111 - впереди 0, затем 1, не помню что именно это обозначает, но какую-то бяку вроде переполнения в результате некоторых операций, те это число - инвалид, и вообще не может быть никуда переведено (вернее его сначала нужно привести к нормальному виду, какими-то хитрыми способами)

это все касалось случая, когда число у нас хранится в доп. коде, если бы мы рассматривали обратный код, то и значения могли быть другими во всех этих вариантах.

Еще заметь, что если бы мы рассматривали хранения беззнаковых целых, то все биты были бы использованы для хранения значения числа, и число FFF даже в 12 битной сетке означало бы 2^12 - 1.

Надеюсь что-то прояснил.

Автор: Ripper 1.11.2007, 20:28
Все равно туго. Я понимаю что одно число в разных системах означает одно и тоже
Не говоря уже как это все в классе описать.
Допустим у нас класс - десятичное число. Мне нужно создать два объекта, в которых будут хранится десятичные числа. 
Я хочу первому присвоить -5. второму 3. и сложить их
Что такое -5? не бывает же -FFF. Значит и 10 числа должны представлятся и рассматриватся с помощью разядной сетки
Или допустим
1111 1010 0011 1101. Что это за число? 11 отрицательное вроде. А САМО значение это что? Все 16 цифр? Если 14 - то оно же портится. 
Я все равно не понимаю смысла. Когда мы решали примерчики н эти коды у нас было что то вроде
3+5 = ? Мы оба представляли в прямом коде, потом в дополнительном потом складывали и потом обратно в прямой и находили ответ .Вроде так. Но тут знак известен. А что значит конструктор, с 16ой константой, я туда же знак не передам вообще. 
вот нужно выполнить действия -452+23 в десятичной. Но я незнаю какой знак когда передаю конструктору. Как компьютер определяет этот знак на основе первых разрядов, это же не верно? Отбрасывается 1-2 разряда (в разных кодах) и само число имеет другой вид. 

Что значит с 8 до F числа отрицательные? т.е. F1 = 1111 0001 = 11. 110001 = число с отрицательным знаком и модулем 110001 = чему то другому? 

Еслиб задавался знак, было бы как то понятней чтоли... Хотя как это выглядит в си вообще ужс smile

Автор: bsa 2.11.2007, 01:01
все очень просто. в 16-тиричной системе счисления нет понятия "отрицательное число". Просто потому, что это лишь цифро-буквенная трансляция тетрады бит. Но, искуственно было введено (на основании математики, конечно), что число, у которого старший бит включен является отрицательным. Но надо иметь в виду, что -10 - это 0xF6 (для байта), а не 0x8A. Почему? А потому что: 0x0A + 0xF6 = 0x100. Но, так как у нас исходных только два разряда, то отбросив 1 получаем 0x00. Что и требовалось доказать.
Но тут сразу может возникнуть вопрос, а как можно представить -255 в 16-тиричной системе, ведь 255=0xFF уже имеет установленный старший бит. Проблема в том, что с начала жизни мы привыкли к тому, что количество разрядов чисел у нас не ограничено. А в компьютерной технике все по-другому. Поэтому программисты постоянно должны понимать, достаточно ли размера переменной, для хранения необходимого диапазона чисел. Исходя из этого, для хранения -255 нужно выбрать минимум 3 разряда, но обычно их степень двойки...

Автор: Ripper 2.11.2007, 08:04
bsa, Как тогда определить чему равно -10? Я написал 1000 1010 но это не верно... 
и как мне получить прямой код в си? Т.е. перевести из 16 в 2 ?  

Автор: bsa 2.11.2007, 10:22
Цитата(Ripper @ 2.11.2007,  08:04)
bsa, Как тогда определить чему равно -10? Я написал 1000 1010 но это не верно... 
и как мне получить прямой код в си? Т.е. перевести из 16 в 2 ?

-10 == 0 - 10 == 0х00 - 0х0A = 0x100 - 0x0A == 0xF6
или
-10 == -00001010 == 11110110 (инверсия всех битов и прибавление единицы) == 0xF6

понимаешь в чем дело, изначально все в компе хранится в 2-м виде. А уже ПО позволяет тебе видеть в других системах счисления.
Если тебе нужно вывести на экран число в двоичном виде, то нет ничего проще - воспользуйся операторами побитного сдвига вправо (>>) и побитовой "И" (&):
Код
char[8] toBin(unsigned char v) {
      char result[8];
      char *p = result;
      for(unsigned char mask = 0x80; mask; mask >>= 1, ++p)
           *p = (v & mask) ? '1' : '0';
      return result;
}

А в 16-тиричную переводится тоже легко. Опять же надо воспользоваться сдвигом, операцией "И" и выборкой из таблицы:
Код
char[2] toHex(unsigned char v) {
     static const char hex[]={'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
     char result[2];
     result[0] = hex[v >> 4];
     result[1] = hex[v & 0xF ];
     return result;
}
Хотя, для перевода в 16-тиричную и обратно можно использовать стандартные средства, например printf/scanf и iostream (манипулятор std::hex).

Автор: Ripper 2.11.2007, 16:26
то что ты написал про -10 это помойму дополнительный код уже (инверсия и прибавление еденицы) а в прямом коде это 10001010 
Но вопрос в том, если я переведу число в двоичный код я получу прямой код? -10 = прямой код равен 10001010. А A5? Тут мы не пишем знак, значит он в самом числе? Тогда прямой код 10100101? 

Автор: powerfox 2.11.2007, 18:17
Цитата(Ripper @  2.11.2007,  09:04 Найти цитируемый пост)
bsa, Как тогда определить чему равно -10? Я написал 1000 1010 но это не верно... 

Цитата(bsa @  2.11.2007,  11:22 Найти цитируемый пост)
-10 == -00001010 == 11110110 (инверсия всех битов и прибавление единицы) == 0xF6

Ещё раз, но по шагам.
Код

Сначала находим, как записывается число 10.
10 = 00001010 (использую 8 бит).
Теперь инвертируем.
11110101
+            1
11110110 -- это и есть -10!


Цитата(Ripper @  2.11.2007,  17:26 Найти цитируемый пост)
то что ты написал про -10 это помойму дополнительный код уже (инверсия и прибавление еденицы) а в прямом коде это 10001010 

Дополнительный код служит для представления отрицательных чисел. Единичка в старшем разряде лишь свидетельствует (признак) о том, что число отрицательное (но просто добавив её, нельзя получить то же число, но с другим знаком). Например, число 3: 0011. Как ты делаешь. то -3 будет 1011 - это неверно. Легко проверить.
Код

  0011
+1011
   1110   -- не 0!!!

Теперь правильное представление -3: ~0011+1 = 1101:
Код

    0011
  +1101
1 | 0000  -- 0! Всё верно.

Я не помню уже, что происходит с той единицей, что вылазит за пределы разрядной сетки. По идее. её контролировать не надо. А вот единичка в старшем разряде как-то используется (но я уже забыл как). Знаю, что есть команды, которые ипользуют признак того, что число отрицательное. Например, число итераций на языке ЭВМ, которую я проходил (упрощённый ассемблер) задавалось отрицательным числом, команда ISZ. кажется. После каждой итерации значение увеличивалось на 1. Проверялся именно старший бит (были так же описаны микрокоманды, составляющие данную команду).

Автор: Ripper 2.11.2007, 18:38
Прямой код я верно пишу. 
[-3]Прямой код =  0011. 
[-3]Обратный = 1101
Меня волнует то как это все дело на Си будет. Если я переведу число в двоичную систему я получу прямой код. потом мне его нужно инвертировать и добавить еденицу. Можно пример как это все делается, когда у меня два конструктора, один из них с hex константой другой со строкой. Вообще меня именно волновал вопрос получу ли я прямой код если переведу число ПРОСто в двоичный код. 
Вот -3 перевести на бумаге понимаю как, а A5 допустим? Если я переведу А5 в двоичный код я получу ПРЯМОЙ код?  (не дополнительный) 
мне нужно хранить всё в прямом коде. а дейсвтия выполнять в дополнительным. Покажите просто пример как из строки и/или константы поулчить прямой код, и сложить два числа в дополнительном например..  

Автор: xvr 2.11.2007, 18:59
Цитата(Ripper @ 2.11.2007,  18:38)
Покажите просто пример как из строки и/или константы поулчить прямой код, и сложить два числа в дополнительном например..

Получение прямого кода из двоичного-дополнительного (или любого другого):
Код

int convert_to_direct_code(int org)
{
 if (org>=0) return org;
 return (-org)|0x8000000;
}

И в другую сторону:
Код

int convert_from_direct_code(int direct)
{
 if (direct&0x80000000) return -(direct&0x7FFFFFFF);
 return direct;
}

Числа подразумеваются 32х битными.

Перевод в/из шестнадцатеричной строки вообще делается элементарно - старший бит прямого представления преобразуется в знак '-', остальные биты формируют число (всегда положительное).

Пример:
Код

int convert_to_direct_code(const char* org)
{
 bool do_negative=false;
 if (*org=='-') {do_negative=true; ++org;}
 int rv=strtoul(org,0,16);
 if (do_negative) rv|=0x80000000;
 return rv;
}

void convert_from_direct_code(int direct, char* out)
{
 if (direct&0x80000000) *out++='-';
 sprintf(out,"%X",direct&0x7FFFFFFF);
}


В твоем случае вместо целого 32х битного числа надо будет использовать многобайтное число, представленное в виде массива.

Автор: powerfox 2.11.2007, 19:34
Цитата(xvr @  2.11.2007,  19:59 Найти цитируемый пост)
Получение прямого кода из двоичного-дополнительного (или любого другого):

int convert_to_direct_code(int org)

O_o
А зачем??? Это ведь просто "портит" число... Ведь простой оператор минус всё сделает сам...
Если уж и реализовывать в виде int, то использовать арифметические операторы.
Цитата(Ripper @  1.11.2007,  17:05 Найти цитируемый пост)
Подскажите, как перевести число которое я передам в конструктор в двоичное, и самое главное - в прямой код как.

Преобразовывать ничего не надо, как уже сказали: число, оно и в Африке число. Просто оно может быть записано по-разному (если уж не понятно, как объясняли выше, то пример - римские и арабские числа).
Как я понял, то просто надо получить массив char, который является представлением числа. Можеро реализовать посимвольный ввод, и писать в массив по числу (либо в двоичном, чтоб юзер вводил, либо в 16x). Если же хочется конструировать представление в виде массива из int, то, на мой взгляд, самое простое - использовать cout и записать в буфер число в нужном представлении. А затем уже прочитаь оттуда по цифре.

Автор: xvr 2.11.2007, 21:45
Цитата

Цитата(xvr @  2.11.2007,  19:59 Найти цитируемый пост)
Получение прямого кода из двоичного-дополнительного (или любого другого):

int convert_to_direct_code(int org)

O_o
А зачем??? Это ведь просто "портит" число... Ведь простой оператор минус всё сделает сам...
Если уж и реализовывать в виде int, то использовать арифметические операторы.
Автору темы нужно было реализовать ПРЯМОЕ представление числа, а в компьютере используется ДОПОЛНИТЕЛЬНОЕ. Очевидно, что арифметику над этим ПРЯМЫМ представлением ему придется писать самому, 'простой оператор минус' расчитан на ДОПОЛНИТЕЛЬНОЕ. Но в его случае ему всеравно придется писать арифметику самому, так как у него будет арифметика с числами произвольной длинны (не 32 бита).
Цитата

Цитата(Ripper @  1.11.2007,  17:05 Найти цитируемый пост)
Подскажите, как перевести число которое я передам в конструктор в двоичное, и самое главное - в прямой код как.

Преобразовывать ничего не надо, как уже сказали: число, оно и в Африке число. Просто оно может быть записано по-разному (если уж не понятно, как объясняли выше, то пример - римские и арабские числа).
Ну надо человеку! Что поделать, задание такое smile
Кстати, в его случае имело бы смысл вообще хранить знак отдельно (не в старшем бите).

Автор: bsa 2.11.2007, 21:51
Ripper
возможно, ты имеешь в виду, что у тебя нет ограничений на разрядность числа? Тогда действительно проще держать модуль числа и знак отдельным полем.

Автор: Ripper 2.11.2007, 22:05
Хорошо, пользователь ввел строку (массив чаров) равную 8AB.  Что должно быть в классе в массиве том? 
Вот число которое в африке число... и неважно в какой оно системе - ну и чего
По мне так как я понял нужно 8АБ представить в двоичном, и записать в массив чаров - это будет прямой код, потом если первая цифра 1 то его инвертировать и прибавить еденицу. Получить дополнительный код. А потом сложение вычитание реализовать
Тока я пока не особо представляю как я это все сделаю, например 1)Разрядная сетка это sizeof(int)*8? 2)допустим два байта 16 бит а число AB в шестадцатеричной. значит 0000 0000 1010 1011 ? А какую тогда цифру вообще проверять, вот 00000000010101011 это записано будет в массиве, но как определить что есть первая. Или наверно нафиг ненужно нули писать. А если ввести AAAAAA то типа переполнение ?
Нет, все равно тупик)))  smile

Добавлено через 4 минуты и 51 секунду
1A - 0001 1010 - что здесь старший бит? [0]001 1010 
A1 - 1010 0001 а здесь [1]010 0001. Т.е. это отрицательное число с модулем 1010 0001 ?

Автор: bsa 2.11.2007, 22:14
Ripper, ты сначала определись, что именно вводит пользователь. Если он может вводить -8AB и 8AB, то тебе нужно в дополнительный код переводить только число с минусом.

Автор: Ripper 2.11.2007, 22:22
Да вроде не сказано в задании как вводить. сказано перегрузить >> <<. Но ведь тут говорят что нет такого понятия как отрицательное число для 8AB. оно отрицательно если первая цифра больше 7. 
Вводить как я понял нужно числа не указывая явно знак.
Тогда что должно быть в массиве в классе, если введены 1А и А1. что здесь будет модулем а что знаком? 

Автор: powerfox 2.11.2007, 22:22
Цитата(xvr @  2.11.2007,  22:45 Найти цитируемый пост)
Автору темы нужно было реализовать ПРЯМОЕ представление числа, а в компьютере используется ДОПОЛНИТЕЛЬНОЕ

Что значит прямое?
Цитата(xvr @  2.11.2007,  22:45 Найти цитируемый пост)
Очевидно, что арифметику над этим ПРЯМЫМ представлением ему придется писать самому, 'простой оператор минус' расчитан на ДОПОЛНИТЕЛЬНОЕ. Но в его случае ему всеравно придется писать арифметику самому, так как у него будет арифметика с числами произвольной длинны (не 32 бита).

Вспомнилась сказка про белого бычка. Тут уже не раз прозвучало. Что есть 2 варианта работы с числом:
1. Хранить его в виде int. Все операции для такого числа есть. Лишь написать функции для представления его в формате, который требует условие (массив char). Вот и всё. Настраиваем, чтобы cout выводила числа в формате hex, выводим в буфер и читаем по цифре в массив. Задание выполнено.
2. Сами реализуем класс и соответствующие операции (в условии я нашёл только сложение), но нам также нужно преобразование в доп. код. Можно реализовать оператор побитового оператора и сложения с int (для приьавления единицы). Неограниченная длина - делаем вектор char и поле класса, которое хранит разрядность. Ничего такого, чтобы спорить.

Цитата(xvr @  2.11.2007,  22:45 Найти цитируемый пост)
Ну надо человеку! Что поделать, задание такое smile

Задание можно понять немного по разному, а реализовать - так вообще множество вариантов.

Добавлено через 3 минуты и 14 секунд
Что-то лень читать особо. Но что за навороты пошли с модулем и числом по отдельности? Всю жизнь число было "единым". Просто определённые разряды интерпретироваться могут по-разному. И зачем тут понятие модуля, если числа целые. Знаковый разряд и само число (модуль числа). Ввоидится вместе.

Ripper, ты получаешь всё число, но проверяешь старший разрад (чтобы узнать знак числа).

Автор: powerfox 2.11.2007, 22:45
Цитата(powerfox @  2.11.2007,  23:22 Найти цитируемый пост)
Что значит прямое?

Аа, понял. От вас просят упрощённо.

http://khpi-iip.mipk.kharkiv.edu/library/datastr/book_sod/structura/chapter2.htm

Автор: xvr 4.11.2007, 10:17
Цитата(Ripper @ 2.11.2007,  22:05)
Хорошо, пользователь ввел строку (массив чаров) равную 8AB.  Что должно быть в классе в массиве том? 
Вот число которое в африке число... и неважно в какой оно системе - ну и чего
По мне так как я понял нужно 8АБ представить в двоичном, и записать в массив чаров - это будет прямой код, потом если первая цифра 1 то его инвертировать и прибавить еденицу. Получить дополнительный код. А потом сложение вычитание реализовать
Тока я пока не особо представляю как я это все сделаю, например 1)Разрядная сетка это sizeof(int)*8? 2)допустим два байта 16 бит а число AB в шестадцатеричной. значит 0000 0000 1010 1011 ? А какую тогда цифру вообще проверять, вот 00000000010101011 это записано будет в массиве, но как определить что есть первая. Или наверно нафиг ненужно нули писать. А если ввести AAAAAA то типа переполнение ?
Нет, все равно тупик)))  smile

Добавлено @ 22:10
1A - 0001 1010 - что здесь старший бит? [0]001 1010 
A1 - 1010 0001 а здесь [1]010 0001. Т.е. это отрицательное число с модулем 1010 0001 ?

Почему то мне кажется, что от вас хотят получить представление с явным знаком, т.е. или '8AB' (положительное) или '-8AB' (отричательное) и не заниматься никакими интерпретациями никаких старших битов smile Так что в массиве должно лежать 8AB (в бинарном виде или в символьном или еще в каком - неважно), а знак должен лежать ВООБЩЕ отдельно, например так:

Код

char value[size];   // Body of number ('size' is template comstant)
bool sign; // Sign on number, false - positive, true - negative

Автор: MAKCim 4.11.2007, 10:39
Цитата(xvr @  4.11.2007,  10:17 Найти цитируемый пост)
а знак должен лежать ВООБЩЕ отдельно, например так:

зачем хранить знак?
Ripper
по разрядности числа лимитированы или нет?
если лимитированы (допустим, 32 разряда)
хранить нужно int
а потом в зависимости от представления, которое нужно получить, преобразовывать этот int

Автор: xvr 4.11.2007, 14:57
Цитата(MAKCim @ 4.11.2007,  10:39)
Цитата(xvr @  4.11.2007,  10:17 Найти цитируемый пост)
а знак должен лежать ВООБЩЕ отдельно, например так:

зачем хранить знак?
Ripper
по разрядности числа лимитированы или нет?
если лимитированы (допустим, 32 разряда)
хранить нужно int
а потом в зависимости от представления, которое нужно получить, преобразовывать этот int

При внимательном изучении первого поста можно сделать выводы:
1) Разрядность лимитированна и много больше, чем 32 бита (int не подойдет)
2) Входные данные представленны в ПРЯМОМ коде (читай - с отдельным знаком), при выполнении операций нужно использовать ДОПОЛНИТЕЛЬНЫЙ код - т.е. имеет смысл данные в конструкторе конвертировать в бинарный дополнительный код и именно в таком виде и хранить (в током случае отдельный знак, как я предлагал ранее, не нужен)

Автор: Ripper 4.11.2007, 22:59
Так. Ещё раз. 16ричное число определяется его длиной (количество цифр в числе, например, до 31) и массивом значений 16ричных цифр (типа char). Число со знаком хранится в прямом коде.

Так что хранить в моем массиве, с одной стороны это массив значений 16ричных чисел. А где хранить прямой код? Тока не говорите что числа везде одни и теже и прямой код один и тотже. Прямой код нужно в двоичном представлении хранить как я понимаю. 


и ещё вопросик
Код

static const char *HexToBin(char dig) {
    switch(dig)
    {
    case '0': return "0000";
    case '1': return "0001";
    case '2': return "0010";
    case '3': return "0011";
    case '4': return "0100";
    case '5': return "0101";
    case '6': return "0110";
    case '7': return "0111";
    case '8': return "1000";
    case '9': return "1001";
    case 'A': return "1010";
    case 'B': return "1011";
    case 'C': return "1100";
    case 'D': return "1101";
    case 'E': return "1110";
    case 'F': return "1111";
    }
    return "";
}


Как эта ф-ия работает? Извините, мне сложно на си переходить с др. языка, поэтому туго осваиваюсь. return "1111" это что, это разве указатель на тип чар? И как её потом использовать, пользователь вводит строку (массив char-ов) в виде 1FF (т.е. hex число) и мне нужно в другой массив записать это дело в 2 коде... 

Тока я так и не понял что туда писать :(

Автор: bsa 5.11.2007, 10:56
Зачем тебе двоичный? У тебя в ТЗ про двоичное ничего не сказано. Храни только прямой код и знак, который будешь учитывать при арифметических операциях.

Автор: Ripper 5.11.2007, 14:02
И как узнать старший бит? Блин. 
В самом hex числе уже зашит знак. А как тогда производить действия в дополнительном коде? Я незнаю что такое дополнительный код в 16ричном виде. 
пользователь вводит FF+2A
1111 1111 + 00101010. Беремь инвертируем и единицу добавляем 0000 0001 11010101 и складываем. Ну что то в этом роде. Ну разве не так?
Пользователь не должен вводить "+FF" - "-FBA"


Автор: xvr 6.11.2007, 10:41
Цитата(Ripper @ 5.11.2007,  14:02)
И как узнать старший бит? Блин. 
В самом hex числе уже зашит знак. А как тогда производить действия в дополнительном коде? 

Не надо хранить число внутри класса в hex виде - храни в бинарном. В задании сказано только про ввод/вывод числа в hex - это не значит, что и внутри должен быть hex
И старший бит тебе не нужен - арифметика (+/-) делается буз учета старшего бита.
Цитата

Я незнаю что такое дополнительный код в 16ричном виде. 
пользователь вводит FF+2A

В шестнадцатиричном просили прямой код т.е. FF+2A это сумма двух ПОЛОЖИТЕЛЬНЫХ чисел
Цитата

1111 1111 + 00101010. Беремь инвертируем и единицу добавляем 0000 0001 11010101 и складываем. Ну что то в этом роде. Ну разве не так?

Нет, просто складываем 1111 1111 + 00101010 (предполагается, что длинна чисел более 8ми битов, иначе в исходных числах ошибка - FF не представимо в виде 8ми битного числа со знаком)

Цитата

Пользователь не должен вводить "+FF" - "-FBA"

Пользователь МОЖЕТ вводить "+FF", и ДОЛЖЕН вводить "-2A"

Автор: Ripper 6.11.2007, 17:33
xvr, Завтра спрошу у препода. я уже незнаю чему верить
-2A - для шестнадцатеричных числе  не определно понятие отрицательное число (гдето выше писали) т.к. первый бит указывает на знак
значит ненужно вводить знак явно.

Автор: xvr 6.11.2007, 20:42
Цитата(Ripper @ 6.11.2007,  17:33)
xvr, Завтра спрошу у препода. я уже незнаю чему верить
-2A - для шестнадцатеричных числе  не определно понятие отрицательное число (гдето выше писали) т.к. первый бит указывает на знак
значит ненужно вводить знак явно.

Если мы можем написать -42, то почему бы не написать -2A ?
И первый бит указывает на знак не у шестнадцатиричных чисел, а у чисел в дополнительном коде - это абсолютно независимые понятия. С тем же успехом мы можем считать десятичные числа представленными в дополнительном коде, т.е. например  (для 8ми битных чисел) 200 будет соотвествовать -56. Требовать от внешнего представления класса, что бы hex числа для ввода/вывода были представленны в дополнительном коде (равно как и влюбом другом), это все равно, что требовать, что бы вместо числа -56 вводили 200.

Автор: powerfox 6.11.2007, 21:06
Цитата(Ripper @  6.11.2007,  18:33 Найти цитируемый пост)
значит ненужно вводить знак явно.

Тебе просто советовали вводить дополнительную переменую для знака. Иначе нужно при любой операции "извлекать" знак из числа.

Добавлено через 1 минуту и 59 секунд
Цитата(xvr @  6.11.2007,  21:42 Найти цитируемый пост)
Если мы можем написать -42, то почему бы не написать -2A ?

xvr, цель 16-й чисел - облегчить работу с двоиным кодом. Кто работает с ними сразу может скачать, что в старшем бите.

Автор: xvr 7.11.2007, 16:09
Цитата(powerfox @ 6.11.2007,  21:06)
Цитата(xvr @  6.11.2007,  21:42 Найти цитируемый пост)
Если мы можем написать -42, то почему бы не написать -2A ?

xvr, цель 16-й чисел - облегчить работу с двоиным кодом. Кто работает с ними сразу может скачать, что в старшем бите.

Цель 16х чисел (В ДАННОМ СЛУЧАЕ) облегчить реализацию класса - многобайтовое преобразование hex<->bin делается легче, чем dec<->bin, но что то мне кажется, что об облегчения реализации, которая требовала бы ЯВНОГО кодирования отрицательных чисел в дополнительном виде речь все таки не шла smile Все таки, когда программы пишутся для пользователей их (пользователей) никто не заставляет вводить отрицательные числа в дополнительном коде, и писать 4294967295 вместо -1
Ы?

Автор: powerfox 7.11.2007, 17:11
Цитата(xvr @  7.11.2007,  17:09 Найти цитируемый пост)
многобайтовое преобразование hex<->bin делается легче, чем dec<->bin

Не вижу принципиальной разницы. В С++ есть средства, которые позволяю быстро преобразовать dec в hex. Это всего несколько дополнительных строк.
И в условии явно сказано, что числа хранятся в прямом коде, а в прямом знак указывается в знаковом разряде. 

Цитата(xvr @  7.11.2007,  17:09 Найти цитируемый пост)
Все таки, когда программы пишутся для пользователей их (пользователей) никто не заставляет вводить отрицательные числа в дополнительном коде, и писать 4294967295 вместо -1

Согласен. Но "ЗАДАНИЕ" есть задание. Можно просто реализовать дополнительный конструктор для чисел, записанных в форме -N.

Автор: Ripper 7.11.2007, 18:44
Препод сначала сказал что нужно знак задавать явно, + - . потом я спросил у меня же написано в дополнительном коде все нужно складывать, что это значит.Ну он говорит ладно тогда переводите в прямой код, знак задается в hex числе..
вообщем как я и предпологал 

Автор: xvr 7.11.2007, 22:26
Цитата(powerfox @ 7.11.2007,  17:11)
Цитата(xvr @  7.11.2007,  17:09 Найти цитируемый пост)
многобайтовое преобразование hex<->bin делается легче, чем dec<->bin

Не вижу принципиальной разницы. В С++ есть средства, которые позволяю быстро преобразовать dec в hex. Это всего несколько дополнительных строк.

И для многобайтовых (>8) чисел тоже есть? И давно?
Цитата

И в условии явно сказано, что числа хранятся в прямом коде, а в прямом знак указывается в знаковом разряде. 
Не хранятся, а ЗАДАЮТСЯ. Про формат хранения не сказано. Кроме того, знак для прямого представления может хранится где угодно - он не используется для выполнения операций (меняются сами операции, но знак в них не участвует)
Цитата

Цитата(xvr @  7.11.2007,  17:09 Найти цитируемый пост)
Все таки, когда программы пишутся для пользователей их (пользователей) никто не заставляет вводить отрицательные числа в дополнительном коде, и писать 4294967295 вместо -1

Согласен. Но "ЗАДАНИЕ" есть задание. Можно просто реализовать дополнительный конструктор для чисел, записанных в форме -N.
Собственно ЗАДАНИЕ этого не требовало smile
Да собственно сам автор уже уточнил:
Цитата

Препод сначала сказал что нужно знак задавать явно, + - . потом я спросил у меня же написано в дополнительном коде все нужно складывать, что это значит.Ну он говорит ладно тогда переводите в прямой код, знак задается в hex числе..
вообщем как я и предпологал 


Автор: Ripper 7.11.2007, 22:38
Теперь вопросы касательно самого языка. 
1)Как я всеже понял я должен перевести hex число в двоичное и записать его в массив. 
Код

_hex::_hex(char* s) {
     len=0;
     char *tmp; int x=0;
     for (; *s; s++) {
         tmp=HexToBin(*s);
         for(int j=0; j<4; j++,x++,tmp++) { 
                 number[x]=*tmp;
         }
         len++;
     }                   
     number[x]='\0'; 
      
}

Вот так коряво я это делаю, используя ф-ию:
Код

char *HexToBin(char dig) {
    switch(dig) {
     case '0': return "0000";
     case '1': return "0001";
     case '2': return "0010";
     case '3': return "0011";
     case '4': return "0100";
     case '5': return "0101";
     case '6': return "0110";
     case '7': return "0111";
     case '8': return "1000";
     case '9': return "1001";
     case 'A': return "1010";
     case 'B': return "1011";
     case 'C': return "1100";
     case 'D': return "1101";
     case 'E': return "1110";
     case 'F': return "1111";
    }
    return "";
}


Единственный вопрос почему последний элемент numer[x] а не number[x+1] = '\0'? что то я скока не считал получается вроде x+1. И может есть более прямой способ это сделать?
Теперь вопрос, а как перевести из массива чаров типа "101010101" в hex число (которое потом нужно будет вывести на экран). Т.е. мне нужно будет перегруживать куча операторов. Один из первых это "<<". Вот я что-то додуматься не могу, как бы это нормаьно сделать. 
Наверно не хватает знаний самого си. Я надеюсь я верно понимаю что в ф-ии приведенной выше return "1111" означает указатель на массив чаров 1111? на начала массива?  
По аналогии что-то не доходит как сделать. 

Автор: xvr 7.11.2007, 23:22
Цитата(Ripper @ 7.11.2007,  22:38)
Теперь вопросы касательно самого языка. 
1)Как я всеже понял я должен перевести hex число в двоичное и записать его в массив. 
Код

_hex::_hex(char* s) {
     len=0;
     char *tmp; int x=0;
     for (; *s; s++) {
         tmp=HexToBin(*s);
         for(int j=0; j<4; j++,x++,tmp++) { 
                 number[x]=*tmp;
         }
         len++;
     }                   
     number[x]='\0'; 
      
}

Вот так коряво я это делаю, используя ф-ию:
Код

char *HexToBin(char dig) {
    switch(dig) {
     case '0': return "0000";
     case '1': return "0001";
     case '2': return "0010";
     case '3': return "0011";
     case '4': return "0100";
     case '5': return "0101";
     case '6': return "0110";
     case '7': return "0111";
     case '8': return "1000";
     case '9': return "1001";
     case 'A': return "1010";
     case 'B': return "1011";
     case 'C': return "1100";
     case 'D': return "1101";
     case 'E': return "1110";
     case 'F': return "1111";
    }
    return "";
}



Не надо так делать. Это САМЫЙ неудобный вид хранения числа.
Цитата

Теперь вопрос, а как перевести из массива чаров типа "101010101" в hex число (которое потом нужно будет вывести на экран). Т.е. мне нужно будет перегруживать куча операторов. Один из первых это "<<". 
Именно. И каждый оператор будет одним большим геморроем  smile 
Цитата

Единственный вопрос почему последний элемент numer[x] а не number[x+1] = '\0'? что то я скока не считал получается вроде x+1. 
Потому что в цикле for(int j=0; j<4; j++,x++,tmp++)  х будет инкрементирован после последней записи в выходной массив.
Цитата

Наверно не хватает знаний самого си. Я надеюсь я верно понимаю что в ф-ии приведенной выше return "1111" означает указатель на массив чаров 1111? на начала массива?  
Да. Получится строка с символьным битовым представлением, выполнять какие либо операции с ним крайне неудобно, хотя бы потому, что у него СТАРШИЕ разряды будут в начале массива, при этом их вес будет зависить от длинны числа, для арифметики это полный кирдык :(
Цитата

И может есть более прямой способ это сделать?
Есть. Надо использовать БИНАРНОЕ (а не текстовое) представление. Примерно так:
Код

template<int Length>
class Hex {
 int body[Length];

 void negate()
   {
     for(int i=0;i<Length;++i) body[i]=~body[i];
     *this += 1;
   }

public:

 Hex(const char* data)
  {
    bool do_invert=false;
    switch(*data)
     {
      case '+': ++data; break;
      case '-':  ++data; do_invert=true; break;
     }
   memset(body,0,sizeof(body));
   for(;*data;++data)
    {
      // Very slow, but very simple
      char s[2]={*data,0};
      *this <<= 4;
      *this += strtoul(s,0,16);
    }
   if (do_invert) negate();
  }

 Hex(int value)
  {
    body[0]=value;
    for(int i=1;i<Length;++i) body[i]=value<0?-1:0;
  }

 Hex& operator +=(const Hex&);
 Hex& operator -=(const Hex&);
 Hex& operator <<=(int);
 Hex& operator >>=(int);

 Hex operator +(const Hex& op2) {Hex rv(*this); rv+=op2; return rv;}
 Hex operator -(const Hex& op2) {Hex rv(*this); rv-=op2; return rv;}
 Hex operator <<(int op2) {Hex rv(*this); rv<<=op2; return rv;}
 Hex operator >>(int op2) {Hex rv(*this); rv>>=op2; return rv;}

 operator int() {return body[0];}
 ostream& operator<<(ostream&);
 istream& operator>>(istream&);
};
Арифметику сам напишешь smile

Автор: powerfox 8.11.2007, 18:03
Цитата(xvr @  7.11.2007,  23:26 Найти цитируемый пост)
И для многобайтовых (>8) чисел тоже есть? И давно?

sizeof(long int) smile
Я думаю, что этого вполне достаточно в большинстве случаев (32, а уж про 64 так вообще молчу).

Автор: Ripper 8.11.2007, 18:44
Не, мой мозг не в состоянии этого понять.
Попробую сделать хоть что-то, храня hex числа в массиве...  
:(

Автор: xvr 8.11.2007, 19:28
Цитата(powerfox @ 8.11.2007,  18:03)
Цитата(xvr @  7.11.2007,  23:26 Найти цитируемый пост)
И для многобайтовых (>8) чисел тоже есть? И давно?

sizeof(long int) smile

sizeof(long int) это 4 (максимум 8), хотелось бы больше smile
Цитата

Я думаю, что этого вполне достаточно в большинстве случаев (32, а уж про 64 так вообще молчу).
Угу, особенно для целей криптографии, арифметики большой точности (типа вычисления числа пи с точностью 1млн знаков) и пр  smile
Сдается мне, что там, где достаточно 32 или 64 бита, классы, такие как фигурировал в задании, не применяют - там и так все просто и прозрачно, со встроенными POD типами.

Добавлено через 1 минуту и 27 секунд
Цитата(Ripper @ 8.11.2007,  18:44)
Не, мой мозг не в состоянии этого понять.
Попробую сделать хоть что-то, храня hex числа в массиве...  
:(

Для начала напиши арифметику с таким представлением, если получится, то и hex ввод/вывод получится тоже.

Автор: Ripper 8.11.2007, 21:13
xvr, мне не хватает знаний по си. мы много чего в инсте не проходили и как бы отсюда следует что это использовать нельзя
И я уже так запарился с этим заданием ужас)
1)template<int Length> что это?
2)что такое <<= ? в побитовых операциях ненашел такого
3)что значит прибавить к *this число? Переместить указатель на объект? что получится?
4)в задании сказано использовать массив char-ов а не int-ов
5)+ ко всему я не понял этот код т.к. незнаю вообще встроенных в си ф-ий, конечно могу посмотреть где нибудь описание, но я к другому клоню - что щас мне это совсем тяжко. Препод сказал сначала можно в hex виде хранить т.е. в массиве чаров 16ричные числа, потом сказал по другому.. Вообщем посмотрим, сделать нужно хоть как-то. Когда 16ричные числа в массиве вроде легче

Автор: powerfox 8.11.2007, 21:26
Цитата(Ripper @  8.11.2007,  22:13 Найти цитируемый пост)
xvr, мне не хватает знаний по си. мы много чего в инсте не проходили и как бы отсюда следует что это использовать нельзя

Если вы многого не проходили, то это не значит, что это нельзя использовать. Максимальное ограничение - конкретная реализация язык (компилятор).
И то, что здесь идёт - не Си, а С++.

Мусье учится на первом курсе?


Цитата(Ripper @  8.11.2007,  22:13 Найти цитируемый пост)
1)template<int Length> что это?

Шаблон, судя по записи. Я с ними плохо знаком, но Length как-то странно здесь смотрится. Обычно указывается просто тип (int в данному случае).


Цитата(Ripper @  8.11.2007,  22:13 Найти цитируемый пост)
2)что такое <<= ? в побитовых операциях ненашел такого

<<= - это оператор. Сдвиг влево и присваивание. Принцип такой же, как и +=, который намного чаще используется.

Цитата(Ripper @  8.11.2007,  22:13 Найти цитируемый пост)
3)что значит прибавить к *this число? Переместить указатель на объект? что получится?

this - укзатель на объект, для которого вызван метод. А *this - сам объект. Обычное разыменовывание.

Цитата(Ripper @  8.11.2007,  22:13 Найти цитируемый пост)
4)в задании сказано использовать массив char-ов а не int-ов

Посмотри базовые сведения о типах в С/С++.


Автор: xvr 8.11.2007, 21:42
Цитата(Ripper @ 8.11.2007,  21:13)
xvr, мне не хватает знаний по си. мы много чего в инсте не проходили и как бы отсюда следует что это использовать нельзя
И я уже так запарился с этим заданием ужас)
1)template<int Length> что это?

Это шаблон, параметризованный константой (не типом). Константа задает длинну представимых чисел (в единицах по 32 бита)
Цитата

3)что значит прибавить к *this число? Переместить указатель на объект? что получится?
Это значит разыменовать this (получится экземпляр класса, а не указатель), потом к этому экземпляру применить оператор +=
Цитата

4)в задании сказано использовать массив char-ов а не int-ов
Все тоже самое можно сделать и в char'ах, ничего (кроме некоторых констант, задающих длинну элемента массива) не изменится
Цитата

Препод сказал сначала можно в hex виде хранить т.е. в массиве чаров 16ричные числа, потом сказал по другому.. Вообщем посмотрим, сделать нужно хоть как-то. Когда 16ричные числа в массиве вроде легче 
Попробуй написать арифметику с ними (+ - и изменение знака), тогда сразу поймешь, что легче smile

Автор: Ripper 8.11.2007, 22:24
Эээх...
1)Можно без шаблонов? Ну не хочется щас читать ещё одну главу в шилде про шаблоны. наверно можно без них
2)И что значит прибавить к экземляру класса число? Этот оператор не реализован, а что он  в итоге должен делать? 
3)Я вообще не понимаю что этот код делает. 
*this += strtoul(s,0,16); 
memset(body,0,sizeof(body));
Что это за ф-ии? 
4)<<= всмысле сдвиг влево и присваивание.. например *this<<=4? 
"<<" знаю вроде, например 1010 после сдвига 0100 (влево). а какой смысле будет у *this<<=4? 

Я пробую так все это делать:
Код

const int MAX_SIZE = 31;
 
class _hex {
      private:
              int sgn;
              int len;
              char number[MAX_SIZE];
      public:
             _hex();
             _hex(char*);
             _hex(const int);
             
             friend ostream& operator<< (ostream& stream, _hex obj);
             friend istream& operator>> (istream& stream, _hex obj);
};

_hex::_hex() {
     len=0; sgn=0;
     *number='\0';
};


_hex::_hex(char* s) {
     int k;
     switch (*s) { 
            case '+': sgn=0; k=1; break;
            case '-': sgn=1; k=1; break;
            default:  sgn=0; k=0;
     }      
     for (len=0; len<MAX_SIZE&&s[len];len++) 
         number[len]=s[len+k];
     number[len]='\0'; 
      
}

Только незнаю насчет 3 конструктора и ввода >> пока ещё. 

Автор: xvr 8.11.2007, 23:35
Цитата(Ripper @ 8.11.2007,  22:24)
Эээх...
1)Можно без шаблонов? Ну не хочется щас читать ещё одну главу в шилде про шаблоны. наверно можно без них

Можно и без шаблонов, тогда длинна числа, которое может хранить класс будет фиксированна (как у тебя и сделано)
Цитата

2)И что значит прибавить к экземляру класса число? Этот оператор не реализован, а что он  в итоге должен делать? 
Какая-нибудь арифметика для этого класса планируется или нет? Этот класс должен описывать число или просто вводить и выводить hex строку? Если это всеже класс, описывающий число, то и вести он себя должен как число. Т.е. уметь складывать себя с другим экземпляром этого же класса. Так же для класса описан конструктор из int - т.е. он будет автоматически создаваться из int при необходимости.
Код

_hex my_number("1234");

// В конструкторе _hex::_hex код
*this += i; // 'i' represents some integer value

// полностью эквивалентен
my_number+=i;

// что эквивалентно
_hex tmp(i);
my_number+=tmp;

// что эквивалентно
_hex tmp(i);
my_number.operator +=(tmp);


Цитата

3)Я вообще не понимаю что этот код делает. 
*this += strtoul(s,0,16); 
memset(body,0,sizeof(body));
Что это за ф-ии? 

strtoul(s,0,16) - преобразует строку s (которая в свою очередь состоит из одного символа из входной последовательности) в число по основанию 16 (т.е. односимвольный hex в обычное число)

*this += ... прибавляет это число к текущему значению класса.

Цитата

4)<<= всмысле сдвиг влево и присваивание.. например *this<<=4? 
"<<" знаю вроде, например 1010 после сдвига 0100 (влево). а какой смысле будет у *this<<=4? 
Эквивалентно my_number = my_number << 4, не забывай - твой класс это ЧИСЛО, и все арифметические операции с ним выполняются как с обычным ЧИСЛОМ (только очень большим)

Цитата

Код

_hex::_hex(char* s) {
     int k;
     switch (*s) { 
            case '+': sgn=0; k=1; break;
            case '-': sgn=1; k=1; break;
            default:  sgn=0; k=0;
     }      
     for (len=0; len<MAX_SIZE&&s[len];len++) 
         number[len]=s[len+k];
     number[len]='\0'; 
      
}

Эта конструкция полностью эквивалентна
Код

_hex::_hex(char* s) {
     switch (*s) { 
            case '+': sgn=0; ++s; break;
            case '-': sgn=1; ++s; break;
            default:  sgn=0;
     }
     strcpy(number,s);
     len=strlen(number);
}
Она просто копирует переданный ей параметр во внутренний буфер. Теперь объясни мне, что ты собираешься с этим буфером дальше делать? Работать с ним как с числом НЕВОЗМОЖНО.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)