[c] char은 기본적으로 서명 또는 서명되지 않습니까?

“C의 완전한 참조”책 char에서 기본적으로 서명되지 않은 것으로 언급되어있다 .

그러나 Visual Studio뿐만 아니라 GCC로 이것을 확인하려고합니다. 기본적 으로 서명 된 것으로 간주 합니다.

어느 것이 맞습니까?



답변

책이 잘못되었습니다. 표준은 일반 char서명 여부를 지정하지 않습니다 .

실제로이 표준은 세 가지 유형 charsigned char, 및을 정의합니다 unsigned char. 당신 #include <limits.h>을 본 다음 CHAR_MIN일반 charsigned보거나 unsigned( CHAR_MIN0보다 작거나 0과 같은 경우 ) 알 수 있지만 세 가지 유형은 표준과 관련하여 구별 됩니다.

char이런 식으로 특별 하다는 점에 유의하십시오 . 변수를로 선언하면 int100 %에 해당하는 것으로 선언됩니다 signed int. 이것은 모든 컴파일러와 아키텍처에 항상 해당됩니다.


답변

알록 지적 , 표준 잎 구현에 그.

gcc의 경우 기본값은 부호가 있지만를 사용하여 수정할 수 있습니다 -funsigned-char. 참고 : Android NDK의 gcc의 경우 기본값은 unsigned 입니다. 로 서명 된 문자를 명시 적으로 요청할 수도 있습니다 -fsigned-char.

MSVC에서 기본값은 부호가 있지만를 사용하여 수정할 수 있습니다 /J.


답변

C99 N1256 draft 6.2.5 / 15 “Types”에는 다음과 같이 형식의 부호가 있습니다 char.

구현시 char을 signed char 또는 unsigned char와 동일한 범위, 표현 및 동작을 갖도록 정의해야합니다.

각주 :

CHAR_MIN에 정의 된 <limits.h>, 0또는 값 중 하나 SCHAR_MIN를 가지며이 옵션을 사용하여 두 옵션을 구별 할 수 있습니다. 선택에 관계없이 char다른 두 가지 유형과 별개이며 두 가지 유형과 호환되지 않습니다.


답변

ANSI C의 사실상의 표준 책인 Dennis Ritchie의 C Programming Language book에 따르면 부호가 있거나 부호가없는 일반 문자는 기계에 따라 다르지만 인쇄 가능한 문자는 항상 양수입니다.


답변

C 표준에 따르면 일반 문자의 서명은 “구현 정의”입니다.

일반적으로 구현자는 아키텍처에서 구현하기에 더 효율적인 것을 선택했습니다. x86 시스템에서 char은 일반적으로 서명됩니다. arm 시스템에서는 일반적으로 서명되지 않습니다 (Apple iOS는 예외).


답변

Bjarne Stroustrup의 “C ++ 프로그래밍 언어”에 따르면 char“구현 정의”입니다. 그것은 할 수 있습니다 signed char또는 unsigned char구현에 따라. char를 사용하여 서명 여부를 확인할 수 있습니다 std::numeric_limits<char>::is_signed.


답변

이제 우리는 표준이 구현에 달려 있음을 알고 있습니다.

그러나 어떻게 유형이 확인 signed또는 unsigned같은 char?

나는 이것을하기 위해 매크로를 썼다 :

#define IS_UNSIGNED(t) ((t)~1 > 0)

와 함께 테스트 gcc, clangcl. 그러나 다른 경우에는 항상 안전한지 확실하지 않습니다.