Bitový doplněk – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Bitový doplněk – C / C++ – Fórum – Programujte.comBitový doplněk – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
Carduus0
Návštěvník
5. 5. 2013   #1
-
0
-

Zdravím,
rád bych vás poprosil, jestli by mi někdo dokázal objasnit, jak funguje bitový doplněk. Hledal jsem všude možně po internetu, ale stále mi není jasné, jak funguje.

Příklad:
 

#include <iostream>
#include <climits>
using namespace std;

int main() {
	int n = 0;
	long long m;
	cout << LLONG_MAX << endl; // 9223372036854775807

	m = ~n;

	cout << m; // -1

	return 0;
}

Mám proměnnou typu int a zabírá tedy 4 byte v paměti, což je 32 bitů. Hodnota je 0, takže by
mělo být uložené jako:
 

00000000 00000000 00000000 00000000

Bitový doplněk z pak tedy bude:
 

11111111 11111111 11111111 11111111

V decimální soustavě je to číslo 4 294 967 295, které by se to typu long long mělo "vejít". Přesto program vypisuje hodnotu -1.

Podle pozorování výstupů jsem usoudil, že:
 

~n = -n - 1

ale podle vysvětlení, která jsem našel na internetu by toto nemělo platit, proto vás prosím o radu.

Zkoušeno v GCC i MSVC.

Díky

Nahlásit jako SPAM
IP: 109.235.1.–
Řešení
Radek Chalupa
~ Redaktor
+1
Super člen
6. 5. 2013   #2
-
0
-
Vyřešeno Nejlepší odpověď

#1 Carduus
Protože tu proměnnou nemáš deklarovanou jako unsigned, tak je její hodnota interpretována jako číslo se znaménkem s tím že ten rozsah je "kolem nuly" a hodnota se "samými jedničkami" je v případě signed proměnné interpretovaná jako -1.

Z druhé strany bráno když si napíšeš:
int i = -1;
unsigned int ui = -1;
v obou případech tam budeš mít "samé jedničky"

Radek Chalupa

- vývoj software na zakázku
- školení programování (C/C++, WinAPI, ATL, COM, ActiveX, C#, NET Framework, MFC)
http://www.radekchalupa.cz

Nahlásit jako SPAM
IP: 213.220.211.–
Carduus0
Návštěvník
6. 5. 2013   #3
-
0
-

Teď už tomu rozumím, díky moc. Nikdy jsem vlastně neuvažoval nad tím, jak jsou uložena záporná čísla, budu muset dostudovat.

Nahlásit jako SPAM
IP: 109.235.1.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 72 hostů

Podobná vlákna

Bitový string na int — založil Eva

Bitový zápis, posun — založil crazy

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý