“C의 완전한 참조”책 char
에서 기본적으로 서명되지 않은 것으로 언급되어있다 .
그러나 Visual Studio뿐만 아니라 GCC로 이것을 확인하려고합니다. 기본적 으로 서명 된 것으로 간주 합니다.
어느 것이 맞습니까?
답변
책이 잘못되었습니다. 표준은 일반 char
서명 여부를 지정하지 않습니다 .
실제로이 표준은 세 가지 유형 char
인 signed char
, 및을 정의합니다 unsigned char
. 당신 #include <limits.h>
을 본 다음 CHAR_MIN
일반 char
을 signed
보거나 unsigned
( CHAR_MIN
0보다 작거나 0과 같은 경우 ) 알 수 있지만 세 가지 유형은 표준과 관련하여 구별 됩니다.
char
이런 식으로 특별 하다는 점에 유의하십시오 . 변수를로 선언하면 int
100 %에 해당하는 것으로 선언됩니다 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
, clang
및 cl
. 그러나 다른 경우에는 항상 안전한지 확실하지 않습니다.