대상에 C 전처리기로 2의 보수 정수가 있는지 테스트하는 방법은 무엇입니까? [복제]

Nov 15 2020

때로는 C 컴파일러의 컴파일러 대상이 정수의 2의 보수 표현을 가지고 있는지 여부 중요하며 전처리 기가 탐지를 수행하는 것이 유용 할 수 있습니다.

에서 표준이 MAX / MIN 매크로를 필요로하기 때문에 limits.hstdint.h처리기 조건문에서 사용할 수있는 표현으로, 나는 생각

#include <limits.h>
#if INT_MIN + INT_MAX == -1
# define HAVE_TWOS_COMPLEMENT 1
#endif

하나의 보수 및 부호 / 크기 아키텍처에는 부호있는 정수에 대한 대칭 값 범위가 있기 때문에 트릭을 수행합니다. 문제는 여기에 뭔가가 누락되었거나 컴파일러와 무관 한 방식으로 이러한 테스트를 수행하는 더 좋은 방법이 있습니까?

답변

2 EricPostpischil Nov 15 2020 at 18:29

2의 보수에서 −1은 111 ... 111로 인코딩됩니다.

1의 보수에서 -1은 111 ... 110으로 인코딩됩니다.

부호 및 크기에서 −1은 100..001로 인코딩됩니다.

따라서 다음은 int유형 의 인코딩을 감지합니다 .

#if   (-1 & 3) == 1
    //  The encoding is sign-and-magnitude.
#elif (-1 & 3) == 2
    //  The encoding is one’s complement.
#elif (-1 & 3) == 3
    //  The encoding is two’s complement.
#else
    //  Not possible in the C standard.
#endif

INT_MIN + INT_MAX == -1C 2018 6.2.6.2 2에서는 "부호 비트 1 및 모든 값 비트가 0 인 값"을 트랩 표현으로 허용하기 때문에 질문에서 제공된 테스트는 신뢰할 수 없습니다.이 경우 INT_MIN-(2 M -1), 여기서 M은 값의 비트 수이고, INT_MAX2 M -1 때문에 INT_MIN + INT_MAX제로이다.