Zamiana liczb na system binarny

0
#include <iostream>

using namespace std;

void ZamianaNaBinarne(int liczba)
{
    const int rozmiar=32;
    int tab[rozmiar]={0};
    int i=0;
    while(liczba)
    {
        tab[i++]=liczba&1;
        liczba>>=1;
    }
    for(int j=i-1;j>=0;j--)
    {
        cout << tab[j] << " ";
    }
}

int main()
{
    cout << "Podaj liczbe" << endl;
    int liczba=0; cin >> liczba;
    ZamianaNaBinarne(liczba);
    return 0;
}

Witam. Napisałem tu program, który zamienia liczby całkowite w systemie dziesiętnym na system binarny. I tutaj pojawia się problem. Mój program nie obsługuje liczb ujemnych. Nie wiem dlaczego. Wydaje mi się, że liczby ujemne w c++ są zapisywane w systemie U2. Ktoś mi tutaj wytłumaczy o co chodzi z liczbami ujemnymi oraz dlaczego mój program ich nie obsługuje.

1

To proste. Każde przesunięcie bitowe dla liczb ze znakiem, powiela najstarszy bit. Efekt jest taki, że w przypadku liczb ujemnych zawsze będziesz miał ustawiony najstarszy bit i twoja liczba, nigdy nie będzie równa zero.
Chodzi o to, by -2>>1 było równe -1 (0xffffffff), a nie 2147483647 (0x7fffffff).

0

Użyj unsigned i tyle.

0

Ktoś by przerobił mój program, aby obsługiwał liczby ujemne? Bo tak w miarę zrozumiałem to co napisał MarekR22, ale nie potrafię przerobić mojego programu.

I jeszcze jedno: Nadal oczekuję odpowiedzi na pytanie: Czy liczby w C++ zapisywane są w systemie U2?

0

Na początku sprawdź czy jest ujemna, jeżeli jest to wyświetl znak minus oraz zrób z niej dodatnią.
Nie, w C++ liczby nie są zapisywane w U2, tylko tak jak to robi sprzęt.

3

w C i C++ int to najkorzystniejszy typ całkowity dla danej architektury (więc zależnie od sprzętu docelowego może mieć od 8 do 64 bitów albo i więcej). Liczby ujemne zapisywane są tak jak preferuje sprzęt (procesor), w 99.9% przypadków będzie to system dopełnień do 2.

Co do tematu: pytanie co chcesz uzyskać dla liczb ujemnych? Np dla -2, czy ma być to: -10, czy 1111111111111110 (16 bitowe), czy -000000000000010?

2
std::string toBinary(unsigned int x) {
      std::string result(8*sizeof(x), '0');

      for(i=result.length()-1; i>=0 && x; --i) {
           if (x&1)
                result[i]='1';
           x>>=1;
      }
      return result;
}

inline std::string toBinary(int x) { // to ma jeden cel: uciszyć ostrzeżenia o utracie znaku
     return toBinary((unsigned int)x);
}
3

korzystajmy z gotowego ;)

http://ideone.com/zypYMC

1 użytkowników online, w tym zalogowanych: 0, gości: 1