У меня есть код на C ++, который преобразует 2-значное восьмеричное число в двоичное число. Для проверки правильности кода я использовал несколько сайтов онлайн-конвертации, таких как
Когда я ввожу 58 или 59 в качестве восьмеричного значения, оно говорит о недопустимых восьмеричных значениях, но когда я ввожу 58 в моем коде, это дает двоичное число как — 101000. Опять же для тестирования я ввожу 101000 как двоичное число в калькуляторе выше веб-сайта, тогда они дают мне результат 50 как восьмеричное значение.
Мне нужно некоторое объяснение, почему это так.
Вот код C ++ —
#include <iostream.h>
#include <conio.h>
void octobin(int);
void main()
{
clrscr();
int a;
cout << "Enter a 2-digit octal number : ";
cin>>a;
octobin(a);
getch();
}
void octobin(int oct)
{
long bnum=0;
int A[6];
//Each octal digit is converted into 3 bits, 2 octal digits = 6 bits.
int a1,a2,quo,rem;
a2=oct/10;
a1=oct-a2*10;
for(int x=0;x<6;x++)
{
A[x]=0;
}
//Storing the remainders of the one's octal digit in the array.
for (x=0;x<3;x++)
{
quo=a1/2;
rem=a1%2;
A[x]=rem;
a1=quo;
}
//Storing the remainders of the ten's octal digit in the array.
for(x=3;x<6;x++)
{
quo=a2/2;
rem=a2%2;
A[x]=rem;
a2=quo;
}
//Obtaining the binary number from the remainders.
for(x=x-1;x>=0;x--)
{
bnum*=10;
bnum+=A[x];
}
cout << "The binary number for the octal number " << oct << " is " << bnum << "." << endl;
}
Восьмеричные числа имеют цифры, которые находятся в диапазоне [0,7]
, Таким образом, 58
а также 59
являются не восьмеричные числа, и ваш метод должен давать ошибочные результаты.
Причина того, что 58
оценивает 101000
потому что первая цифра восьмеричного числа расширяется до первых трех цифр двоичного числа. 5 = 101_2
, Та же история для второй части, но 8 = 1000_2
так что вы получите только 000
часть.
Альтернативное объяснение состоит в том, что 8 = 0 (mod 8)
(Я использую =
подписать для конгруэнтность здесь), так что оба 8
а также 0
будет оценивать 000
в двоичном коде с использованием вашего кода.
Наилучшим решением будет проверка входных данных. Например, во время преобразования вы можете убедиться, что цифра находится в диапазоне [0,7]
Вы не можете использовать 58 или 59 в качестве входного значения. Это восьмеричное, ради Христа.
Допустимые цифры от 0 до 7 включительно.
Если вы кодируете число в базе 8, ни один из октетов не может быть 8 или больше. Если вы собираетесь делать октет кода по октету, необходимо выполнить тест, чтобы увидеть, является ли октет 8 или 9, и выдать ошибку. Прямо сейчас ваш код не проверяет это, поэтому 8 и 9 переполняются до 10.
58 и 59 не являются действительными восьмеричными значениями … максимальная цифра, которую вы можете использовать, это yourbase-1:
десятичная => базовая = 10 => цифры от 0 т 9
шестнадцатеричный => base = 16 => цифры от 0 до 15 (ну, от 0 до F)
Восьмеричное => базовое = 8 => цифры от 0 до 7