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?
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.
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
.
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ści0
lubSCHAR_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.
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.
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).
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
.
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