programing

기본적으로 char가 서명 또는 서명되지 않았는가?

prostudy 2022. 5. 8. 22:03
반응형

기본적으로 char가 서명 또는 서명되지 않았는가?

「C의 완전한 참조」라는 책에서는 다음과 같이 언급하고 있다.char기본적으로 서명되지 않음.

하지만 나는 비주얼 스튜디오뿐만 아니라 GCC로 이것을 검증하려고 한다.그것은 기본적으로 서명된 것으로 받아들이고 있다.

어느 것이 정확한가?

그 책은 틀렸다.이 표준은 일반인지 여부를 명시하지 않음char서명되거나 서명되지 않은 경우.

실제로 이 표준은 다음과 같은 세 가지 구별되는 유형을 정의한다.char,signed char, 그리고unsigned char.만약에#include <limits.h>그리고 나서 봐.CHAR_MIN, 당신은 쉽게 알 수 있다.char이다signed또는unsigned(만약CHAR_MIN0보다 작거나 0과 같음)이지만, 그 경우에도 표준에 관한 한 세 가지 유형이 구별된다.

유의하십시오.char이런 면에서 특별하다.변수를 다음과 같이 선언하는 경우int라고 선언하는 것과 100% 동등하다.signed int이것은 모든 컴파일러와 아키텍처에 항상 적용된다.

알록이 지적하듯이, 표준은 그것을 이행하는 것으로 남겨둔다.

gcc의 경우 기본값은 서명되지만 . note를 사용하여 수정할 수 있다. Android NDK의 gcc의 경우 기본값은 서명되지 않음입니다.로 서명된 문자를 명시적으로 요청할 수도 있다.

MSVC에서는 기본값이 서명되지만 를 사용하여 기본값을 수정할 수 있다.

C99 N1256 초안 6.2.5/15 "유형"은 유형의 서명한 네스에 대해 다음과 같이 말하고 있다.char:

구현은 서명된 문자 또는 서명되지 않은 문자 중 하나와 동일한 범위, 표현 및 동작을 갖도록 char를 정의해야 한다.

그리고 각주에 다음과 같이 기록한다.

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

C 표준에 따르면 일반 문자의 서명은 "이행 정의"이다.

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

우리는 표준이 그것을 이행하는 것으로 남겨둔다는 것을 알고 있다.

그런데 어떤 유형을 어떻게 체크하느냐는signed또는unsigned예를 들어char?

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

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

테스트해 보십시오.gcc,clang, 그리고cl하지만 다른 경우에 항상 안전한지는 잘 모르겠어.

ANSI C의 실제 표준서인 Dennis Ritchie의 The C Programming Language 책에 따르면, 서명되거나 서명되지 않은 일반 문자는 기계에 의존하지만 인쇄 가능한 문자는 항상 양적이다.

참조URL: https://stackoverflow.com/questions/2054939/is-char-signed-or-unsigned-by-default

반응형