Pola bitowa a signed int

0

Witam, chciałbym dowiedzieć sie dlaczego jak w strukturze zmniejszę zakres zmiennych do 4 bitów to liczba w zmiennej unsigned jest podawana prawidłowo a w signed nie ??

#include <QCoreApplication>
#include <QDebug>

struct testowa
{
    unsigned int pole:4;
    signed int pole2:4;
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    testowa nowa = {15, 15};

    qDebug() << " Unsigned : " << nowa.pole  << endl;
    qDebug() << " Signed : "   << nowa.pole2 << endl;

    return a.exec();
}
0

Wypadałoby napisać jaki dostajesz wynik.
A tak bez Qt się nie da?
Ile bitów ma liczba znakowana z 4-ma bitami na wartość?

2

Bo 4 bitowa zmienna ze znakiem ma zakres [-8, 7] zakładając kod U2. Nie ma siły, żeby wartość 15 weszła w 4 bity jeżeli ma być signed.

Dodatkowo przepełnienie dla liczb ze znakiem to w C++ undiefned behavior.

0
vpiotr napisał(a):

Wypadałoby napisać jaki dostajesz wynik.
A tak bez Qt się nie da?
Ile bitów ma liczba znakowana z 4-ma bitami na wartość?

Wynik dostaję taki :Unsigned : 15
Signed : -1



 > ##### [Endrju napisał(a)](http://4programmers.net/Forum/1074030):
> Bo 4 bitowa zmienna ze znakiem ma zakres `[-8, 7]` zakładając kod U2. Nie ma siły, żeby wartość `15` weszła w 4 bity jeżeli ma być `unsigned`.
> 
> Dodatkowo przepełnienie dla liczb ze znakiem to w C++ *undiefned behavior*.


No to wynik dla signed powinnien być 7 a jest -1.

Ps. Bo to że w znakowej ostatni bit określa znak +/- to pamiętam.
Ps2. Najlepsze to jest to, że dzisiaj mieliśmy to na lekcji, ale psor nawet nam tego nie wytłumaczył tylko powiedział, że tak musi być :)
3

Najprościej wyobrazić sobie liczbę znakowaną jako bitową przez odjęcie 1 od zera.
"Zawijając się" daje liczbę z wszystkimi bitami ustawionymi na 1, czyli dla 4 bitów 1111 (to -1 niezależnie od szerokości bitowej).
Dodając do tego 1 "przekręcasz" wartość i otrzymasz 0 (z tym że signed int-a w C/C++ nie wolno przekręcać).

Czyli:
0000 = 0
0000 - 0001 = 1111 = -1
1111 - 0001 = 1110 = -2
itd.

0

Dzięki wszystkim za pomoc, wreszcie to zrozumiałem :)

Przydał się link od _13th_Dragon :D

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