문제

"C의 완전한 참조"책에서 char 기본적으로 서명되지 않았습니다.

그러나 나는 GCC와 Visual Studio로 이것을 확인하려고 노력하고 있습니다. 그것은 그것을 사용하고 있습니다 서명 기본적으로.

어느 것이 맞습니까?

도움이 되었습니까?

해결책

책이 잘못되었습니다. 표준은 평원을 지정하지 않습니다 char 서명 또는 서명되지 않았습니다.

실제로 표준은 세 가지 유형을 정의합니다. char, signed char, 그리고 unsigned char. 만약 너라면 #include <limits.h> 그리고보세요 CHAR_MIN, 당신은 평범한 지 알 수 있습니다 char ~이다 signed 또는 unsigned (만약에 CHAR_MIN 0보다 적거나 0)이지만 그럼에도 불구하고 세 가지 유형이 뚜렷합니다 표준에 관한 한.

주목하십시오 char 이런 식으로 특별합니다. 변수를 다음과 같이 선언하는 경우 int 그것은 그것을 선언하는 것과 100% 동일합니다 signed int. 이것은 항상 모든 컴파일러와 아키텍처에 해당됩니다.

다른 팁

처럼 Alok이 지적합니다, 표준은이를 구현까지 맡깁니다.

GCC의 경우 기본값이 서명되었지만이를 수정할 수 있습니다. -funsigned-char. 노트: Android NDK의 GCC의 경우 기본값이 서명되지 않았습니다.. 서명 된 캐릭터를 명시 적으로 요청할 수도 있습니다 -fsigned-char.

MSVC에서는 기본값이 서명되었지만이를 수정할 수 있습니다. /J.

C99 N1256 초안 6.2.5/15 "유형"은 유형의 서명에 대해 말할 수 있습니다. char:

이행은 Char가 서명 된 Char 또는 부호없는 Char와 동일한 범위, 표현 및 행동을 갖도록 정의해야합니다.

그리고 각주에서 :

CHAR_MIN, 정의 된 <limits.h>, 값 중 하나가 있습니다 0 또는 SCHAR_MIN, 그리고 이것은 두 가지 옵션을 구별하는 데 사용될 수 있습니다. 선택에 관계없이 char 다른 두 가지와 별도의 유형이며 어느 쪽과도 호환되지 않습니다.

ANSI C의 Facto 표준 책인 Dennis Ritchie의 C 프로그래밍 언어 책에 따르면, 서명하거나 서명되지 않은 평범한 숯은 기계 의존적이지만 인쇄용 문자는 항상 긍정적입니다.

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. 그러나 나는 그것이 다른 경우에 항상 안전하다는 것을 확신하지 못합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top