Co się stanie, jeśli przypisam wartość ujemną do zmiennej niepodpisanej?

Byłem ciekaw, co by się stało, gdybym przypisał wartość ujemną do zmiennej niepodpisanej.

Kod będzie wyglądał mniej więcej tak.

unsigned int nVal = 0;
nVal = -5;
Nie dało mi to żadnego błędu kompilatora. Kiedy uruchomiłem program nVal przypisano dziwną wartość! Czy to możliwe, że wartość dopełniacza 2 zostanie przypisana nVal?
Author: Evan Carroll, 2010-04-26

5 answers

Dla oficjalnej odpowiedzi-sekcja 4.7 conv.integral

"Jeśli typ docelowy jest niepodpisany, wartość wynikowa jest najmniejszą niepodpisaną liczbą całkowitą zgodną ze źródłową liczbą całkowitą (modulo 2 n gdzie n jest liczbą bitów używanych do reprezentowania niepodpisanego typu). [Uwaga: w reprezentacji dopełniacza dwójki konwersja ta jest pojęciowa i nie ma zmian w wzorze bitowym (jeśli nie ma obcinania). - Uwaga końcowa]

To zasadniczo oznacza to, że jeśli bazowa Architektura przechowuje w metodzie, która nie jest dopełnieniem Two (jak Signed Magnitude lub One ' s Complement), konwersja do unsigned musi zachowywać się tak, jakby była dopełnieniem Two.

 53
Author: Dennis Zickefoose,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-27 10:59:58

Przypisany zostanie wzorzec bitowy reprezentujący -5 (w dopełniaczu 2) do niepodpisanej liczby całkowitej. Co będzie dużą wartością niepodpisaną. Dla 32 bitowych ints będzie to 2^32-5 lub 4294967291

 23
Author: Jasmeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-18 19:16:18

Zostanie pokazana jako dodatnia liczba całkowita o wartości max unsigned integer-4 (wartość zależy od architektury komputera i kompilatora).

BTW
Możesz to sprawdzić pisząc prosty program Typu C++ "hello world" i przekonaj się sam

 4
Author: Dror Helper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-26 06:46:50

Masz rację, podpisana liczba całkowita jest przechowywana w postaci dopełniacza 2, a niepodpisana liczba całkowita jest przechowywana w niepodpisana reprezentacja binarna . C (i c++) nie rozróżnia tych dwóch, więc wartość, z którą kończysz, jest po prostu niepodpisaną wartością binarną reprezentacji binarnej dopełniacza 2.

 4
Author: perimosocordiae,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-26 06:49:02

Tak, masz rację. Rzeczywista przypisana wartość jest podobna do wszystkich ustawionych bitów z wyjątkiem trzeciego. -1 to wszystkie bity ustawione (hex: 0xFFFFFFFF), -2 to wszystkie bity z wyjątkiem pierwszego i tak dalej. To, co zobaczysz, to prawdopodobnie wartość szesnastkowa 0xFFFFFFFB, która w układzie dziesiętnym odpowiada 4294967291.

 0
Author: Martin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-07 01:43:06