Kod binarny U2 - jaki jest MSB liczby ujemnej?

0

Witam

Zaciekawiłem się przedstawianiem liczb w komputerze. Chciałem sprawdzić czy faktycznie jest tak kod U2. Wszystko się zgadza, ale jeśli zrobiłem sobie funkcję drukującą wszystkie bity każdej liczby to zobaczyłem, że MSB liczby ujemnej (a więc ten który jest odpowiedzialny za znak) równa się -1.
Wygląda to mniej więcej tak:

liczba 6:   00000000000000000000000000000110 (32bit na typ int)
liczba -6: -11111111111111111111111111111001

Sprawdziłem: znak minus ma ten pierwszy znak z lewej. Jak to możliwe skoro niby są przetrzymywane znaki w formie binarnej? Zawsze tak jest, czy też tylko na niektórych kompilatorach?

0

Oczywiście druga liczba wygląda tak:

liczba -6: -11111111111111111111111111111010

Tak się skupiłem na tej -1 z przodu, że źle przepisałem końcówkę liczby, która oczywiście musi wyglądać nieco inaczej (dodaje się przecież 1)

0

bit może być 0 albo 1
nie może być -1 :| coś skopałeś przy wypisywaniu

0

Zamieszczam więc kod:

#include <stdio.h>
int bit(int liczba, int n){
      int size = sizeof(int)*8;
      return (liczba & (1 << size-1-n)) >> (size-1-n);
}

int main ()
{  
   int n, liczba = 6;
   for(n = 1; n <= sizeof(int)*8; n++)
      printf("%d",bit(liczba,n-1));
   printf("\n");
   for(n = 1; n <= sizeof(int)*8; n++)
      printf("%d",bit(-liczba,n-1));
   getchar();
   return 0;
}
0

jak doszedłeś do:

return (liczba & (1 << size-1-n)) >> (size-1-n);

?

powinno być raczej coś w stylu

return (liczba >> n) & 1;

zerowy bit ma oznaczać najmłodszy (najmniej znaczący)

0

na twoim kompilatorze jest przesunięciem arytmetycznym, nie logicznym (ogólnie jest to chyba implementation defined).

0

Chciałem aby n = 0 wskazywało na MSB (lewy).... ale widzę że coś przekręciłem bo Twoja metoda działa, nawet podstawiając za n: (size-1-n) i uzyskując przepisywanie od drugiej strony.
Dziękuję ślicznie

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