2013-06-25 2 views
0

У меня есть код на C++, который преобразует 2 цифры восьмеричного числа в двоичное число. Для проверки достоверности кода я использовал несколько сайт преобразования онлайн какВзаимозависимость от восьмеричного до двоичного преобразования

this и this

Когда я вхожу 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

'void main' не является действительной сигнатурой для' main'. Используйте 'int main'. – chris

+0

'clrscr' не является стандартной функцией C или C++. Зачем вам нужно очищать экран каждый раз (он удалит предыдущие данные, которые могут быть полезны при решении проблем)? –

ответ

3

Вокругные цифры имеют цифры в диапазоне [0,7]. Таким образом, 58 и 59 - это , а не восьмеричные числа, и ваш метод должен давать ошибочные результаты.

Причина, по которой 58 оценивается в 101000, состоит в том, что первая цифра восьмеричного номера увеличивается до первых трех цифр двоичного числа. 5 = 101_2. Та же история для второй части, но 8 = 1000_2, так что вы получите только часть 000.

Альтернативное объяснение состоит в том, что 8 = 0 (mod 8) (я использую = знак congruency здесь), так как 8 и 0 будет вычисляться 000 в двоичной системе с использованием кода.

Лучшим решением было бы сделать некоторую проверку ввода. Например, при преобразовании вы можете проверить, не находится ли цифра в диапазоне [0,7]

0

Вы не можете использовать 58 или 59 в качестве входного значения. Это восьмерично, ради Христа.

Действительные цифры от 0 до 7 включительно.

0

58 и 59 не являются допустимыми значениями восьмеричных действительно ... максимальная цифра, которую вы можете использовать это yourbase-1:

десятичных => базы = 10 => Цифр от 0 т 9

шеснадцатиричном => базовые = 16 => Цифры от 0 до 15 (ну, от 0 до F)

восьмиштырьковый => база = 8 => Цифры от 0 до 7

0

Если вы кодирующая число в базе 8 , ни один из октетов не может быть 8 или больше. Если вы собираетесь выполнять октет кода по октету, необходимо проверить, является ли октет 8 или 9, и выдать ошибку. Прямо сейчас ваш код не проверяет это, чтобы 8 и 9 переполнялись до 10.