С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
28 / 28 / 10
Регистрация: 10.03.2012
Сообщений: 249
.NET 4.x

Неправильно умножаются большие шестнадцатеричные числа

07.05.2012, 12:48. Показов 1878. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу калькулятор. Для обработки шестнадцатеричных чисел написал два метода:

Десятеричное в шестнадцатеричное:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
public string DecimalToHexadecimalSystem(long  digit)
        {
            //digit = Double.Parse(Console.ReadLine());
            bool positive = true;
            //if (digit < 0) { digit = Math.Abs(digit); positive = false; }
            string _result = "";
            long remainder = 0;          
 
            if (digit >= 0 && digit <= 9)
            {
                _result += digit.ToString(); return _result;
            }
            if (digit >= 10 && digit <= 16)
            {
                switch (digit.ToString())
                {
                    case "10":
                        { _result += "A"; return _result; }
                    case "11":
                        { _result += "B"; return _result; }
                    case "12":
                        { _result += "C"; return _result; }
                    case "13":
                        { _result += "D"; return _result; }
                    case "14":
                        { _result += "E"; return _result; }
                    case "15":
                        { _result += "F"; return _result; }
                    case "16":
                        { _result += "10"; return _result; }
                }
            }
 
            while (digit > 0)
            {
                remainder = digit % 16;
 
                if (remainder >= 0 && remainder <= 9) _result += remainder.ToString();
                else if (remainder >= 10 && remainder <= 16)
                {
                    switch (remainder.ToString())
                    {
                        case "10":
                            { _result += "A"; break; }
                        case "11":
                            { _result += "B"; break; }
                        case "12":
                            { _result += "C"; break; }
                        case "13":
                            { _result += "D"; break; }
                        case "14":
                            { _result += "E"; break; }
                        case "15":
                            { _result += "F"; break; }
                        case "16":
                            { _result += "10"; break; }
                    }
                }
                digit = (digit - remainder) / 16;
            }
            char[] arr = _result.ToCharArray();
            Array.Reverse(arr);
            _result = new string(arr);
            if (!positive) { _result = "-" + _result; }
            return _result;
        }
И наоборот:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public double HexadecimalToDecimalSystem(string input)
        {
            double result = 0;             
            string[] array = new string[input.Length];
            int i = 0;
            foreach (char x in input)
            {
                if (Char.IsDigit(x))
                {
                    array[i] = x.ToString(); i++;
                }
                else
                {
                    switch (x)
                    {
                        case 'A': { array[i] = "10"; i++; break; }
                        case 'B': { array[i] = "11"; i++; break; }
                        case 'C': { array[i] = "12"; i++; break; }
                        case 'D': { array[i] = "13"; i++; break; }
                        case 'E': { array[i] = "14"; i++; break; }
                        case 'F': { array[i] = "15"; i++; break; }
                    }
                }
            }
 
            int pow = array.Length - 1;
 
            for (i = 0; i < array.Length; i++)
            {
                result += Convert.ToDouble(array[i]) * Math.Pow(16, pow);
                pow--;
            }           
                return result;
        }
Вот так пробую умножать:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
        public string Hexa_operations(string ex1,string ex2, string op)
        {
            double ex = 0;
            switch(op)
            {
                case "+":
                    {
                        ex = conv.HexadecimalToDecimalSystem(ex1) + conv.HexadecimalToDecimalSystem(ex2);
                        if (ex < 0) ex *= -1;
                        ex = (int)ex;
                        return conv.DecimalToHexadecimalSystem(Convert.ToInt64(ex));
                    }
 
                case "-":
                    {
                        ex = conv.HexadecimalToDecimalSystem(ex1) - conv.HexadecimalToDecimalSystem(ex2);
                        if (ex < 0) ex *= -1;
                        ex = (int)ex;
                        return conv.DecimalToHexadecimalSystem(Convert.ToInt64(ex));
                    }
                case "*":
                    {
                        ex = conv.HexadecimalToDecimalSystem(ex1) * conv.HexadecimalToDecimalSystem(ex2);
                        if (ex < 0) ex *= -1;
                        ex = (int)ex;
                        return conv.DecimalToHexadecimalSystem(Convert.ToInt64(ex));
                    }
                case "/":
                    {
                        ex = conv.HexadecimalToDecimalSystem(ex1) / conv.HexadecimalToDecimalSystem(ex2);
                        if (ex < 0) ex *= -1;
                        ex = (int)ex;
                        return conv.DecimalToHexadecimalSystem(Convert.ToInt64(ex));
                    }
            }
            return "0";
        }

Максимальное число, которое моя программа способна обработать: F в седьмой степени. F в восьмой возвращает -80000000.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.05.2012, 12:48
Ответы с готовыми решениями:

Неправильно считываются большие числа
К примеру следующие команды дают такой вот результат (Nasm): mov dword , 4294967296 ; тут он сразу даёт ошибку, что и ясно. Число...

Как умножаются двоичные числа со знаком в процессоре ?
Перерыл весь интернет . Как происходит умножение беззнаковых чисел понял . А вот со знаковыми беда . Умножение без знака . ...

Нужен алгоритм, где все цифры числа умножаются, кроме нолей
сумма членов натурального числа : var i, sum: integer; var su, ss: String; begin su := Edit1.Text; sum:=0; for i := 1...

4
Злой няш
 Аватар для I2um1
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
07.05.2012, 12:53
Цитата Сообщение от van Persie Посмотреть сообщение
F в восьмой возвращает -80000000.
И? long и double не резиновые.
0
28 / 28 / 10
Регистрация: 10.03.2012
Сообщений: 249
07.05.2012, 13:00  [ТС]
Цитата Сообщение от Blood-Angel Посмотреть сообщение
И? long и double не резиновые.
Потому я и здесь. Может кто-то подскажет просчёты в моем решении...
0
Злой няш
 Аватар для I2um1
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
07.05.2012, 13:06
van Persie, просчет в том, что необходимо хранить десятичное представление числа тоже строкой, а не с помощью long или double. Хотя в идеале лучше использовать не string для представления десятичного и шестнадцатеричного числа, а массив байтов/битов.

Не по теме:

C#
1
result += Convert.ToDouble(array[i]) * Math.Pow(16, pow);
Почитай на счет StringBuilder и больше не пиши такое безобразие.

1
28 / 28 / 10
Регистрация: 10.03.2012
Сообщений: 249
07.05.2012, 13:50  [ТС]
Цитата Сообщение от Blood-Angel Посмотреть сообщение
van Persie, просчет в том, что необходимо хранить десятичное представление числа тоже строкой, а не с помощью long или double.

Подскажите как можно сложить несколько чисел типа long без использования типа long так, чтобы сохранить результат в строку string
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.05.2012, 13:50
Помогаю со студенческими работами здесь

Разбить шестнадцатеричные числа на три части
задача такова, что на вход подаются данные(их я напишу ниже): шестнадцатеричные цифры, которые потом мы должны разбить на три компонента. ...

Шестнадцатеричные числа в массиве unsigned char
Есть массив unsigned char - заполнен, и знаем длину. В массиве шестнадцатиричное число вида: 51fa9 Нужно реализовать арифметические...

Шестнадцатеричные числа, определить наибольший общий делитель
Помогите сделать задание, завтра сдавать... Заданы два длинных неотрицательных шестнадцатеричных числа. Напишите программу, определяющую...

Перевести шестнадцатеричные числа из их представления в формате float в десятичный вид
Здравствуйте! Мне нужно заполнить таблицу, состоящую из 4х столбиков: Hex, Bin, Dec, Вид числа. В первом столбике записано число...

Преобразовать входной файл, заменив в нем шестнадцатеричные числа на десятичные и наоборот.
Очень нужна ваша помощь Разработать программу и подпрограмму (подпрограммы). Преобразовать входной файл, заменив в нем...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru