Czy znak jest domyślnie podpisany czy niepodpisany?

W książce "Complete Reference of C" jest wspomniane, że char jest domyślnie niepodpisany.

Ale staram się to zweryfikować zarówno z GCC, jak i Visual Studio. Domyślnie przyjmuje go jako podpisany.

Który jest poprawny?

 127
Author: Jonathan Leffler, 2010-01-13

6 answers

Książka jest zła. Standard nie określa, czy zwykły char jest podpisany czy niepodpisany.

W rzeczywistości norma definiuje trzy różne typy: char, signed char, i unsigned char. Jeśli #include <limits.h>, a następnie spojrzeć na CHAR_MIN, można dowiedzieć się, czy zwykły char jest signed lub unsigned (Jeśli CHAR_MIN jest mniejszy niż 0 lub równy 0), ale nawet wtedy, trzy typy są różne jeśli chodzi o standard.

 162
Author: Alok Singhal,
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-01-13 07:08:21

Jak podkreśla Alok, standard pozostawia to do realizacji.

Dla gcc wartość domyślna jest podpisana, ale można ją zmodyfikować za pomocą -funsigned-char. Uwaga: dla gcc w systemie Android NDK, domyślną wartością jest unsigned . Możesz również wyraźnie poprosić o znaki podpisane za pomocą -fsigned-char.

W MSVC domyślna wartość jest podpisana, ale można ją zmodyfikować za pomocą /J.

 57
Author: R Samuel Klatchko,
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
2013-05-05 06:52:48

C99 n1256 draft 6.2.5/15 "typy" ma to do powiedzenia o podpisanej-ness typu char:

Implementacja definiuje znak tak, aby miał taki sam zakres, reprezentację i zachowanie, jak znak signed char lub znak unsigned char.

I w przypisie:

CHAR_MIN, zdefiniowany w <limits.h>, będzie miał jedną z wartości 0 lub SCHAR_MIN i może być użyty do rozróżnienia dwóch opcji. Niezależnie od dokonanego wyboru, {[0] } jest odrębnym typem z pozostałych dwóch i nie jest kompatybilny z żadnym z nich.

 29
Author: Michael Burr,
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
2015-06-02 17:22:59

Zgodnie z podręcznikiem języka programowania C autorstwa Dennisa Ritchie, który jest de facto standardem dla ANSI C, znaki zwykłe podpisane lub niepodpisane są zależne od maszyny, ale znaki drukowalne są zawsze dodatnie.

 7
Author: Ravi Rathi,
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
2013-05-13 05:55:43

Zgodnie ze standardem C znakowanie zwykłego znaku to "implementacja zdefiniowana".

W ogólności implementatorzy wybrali ten, który był bardziej efektywny do zaimplementowania na ich architekturze. W systemach x86 znak jest zazwyczaj podpisywany. W systemach arm jest na ogół niepodpisany (wyjątkiem jest Apple iOS).

 5
Author: plugwash,
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
2016-11-23 18:55:49

Według "języka programowania C++" Bjarne Stroustrupa, char jest "implementacją zdefiniowaną". Może to być signed char lub unsigned char w zależności od implementacji. Możesz sprawdzić, czy char jest podpisane, czy nie, używając std::numeric_limits<char>::is_signed.

 3
Author: BoQ,
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
2017-10-02 10:43:00