Почему использование long int вместо int заставляет мой код работать? - PullRequest
0 голосов
/ 24 сентября 2018
#include <iostream>

using namespace std;

int main()
{
    long int b2 = 0;
    long int i = 1;
    int x;

    cout << "Enter a number:" ;
    cin >> x ;
    int y = x;
    while (x!=0) {
         if ( x%2 )
         {
             b2 = b2 + i;
         }
         i = i*10;
        x=x/2;
     }
     cout << "Number " << y << " in base(2) is: " << b2;
}    

Этот код преобразует любое число из базы 10 в двоичное.Есть только одна проблема: если я изменю любую переменную b2 или i на int вместо long int и вставлю число больше 1000, я получу странные результаты, иногда отрицательные.Я использую Ubuntu 18.04 и code :: blocks для компиляции.Я исследовал, но не мог найти ответ.Int имеет 4 байта, что означает 2 ^ 32 возможностей.Это должно работать ...

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Вы путаете числа с цифрами.

A (32-разрядный) int (безусловно, самый распространенный в наши дни) может содержать 2 ^ 32 (около 4 миллиардов) возможных значений.Но каждое из этих значений является числом .0b10000, 0x10, 020 и 16 - это разные цифры, но как int они все имеют одинаковое число .На этом уровне преобразование не производится.

То, что вы делаете, пытается использовать числа в качестве чисел.И это вызовет у вас головную боль.Умножая на 10 для сдвига, вы эффективно используете десятичные цифры в качестве битов.Десятичная цифра стоит немногим более 3 бит (log 2 10 ~ = 3.322), что означает, что ваше 32-битное число может без проблем представлять только 10 бит.Любое значение свыше 1023 в конечном итоге станет 11-значным числом и переполнит ваш int.

Использование long int вместо может дать вам еще 32 бита, если в вашей среде 64-бит long с.Это увеличит ваш лимит до 19 "бит" (20, если вы используете unsigned long).Но лучшее решение - вместо этого использовать строку, если целью является просто увидеть двоичное представление.

0 голосов
/ 24 сентября 2018

Проблема с вашим кодом.Вы на самом деле не конвертируете число 10 в базу 2. Вы храните ваш номер как int или long, поэтому он очень быстро становится больше, чем int или long.Числа на нашем компьютере уже хранятся в двоичном виде.

Если вы действительно хотите напечатать число, см. std::bitset.

Если вы хотите воспроизвести числа,как установка или очистка битов, вы должны использовать маску.Или лучше использовать std::bitset из стандартной библиотеки c ++;

...