와 정수 유형 :
#define LNG_BIT (sizeof(long) * CHAR_BIT)
unsigned long num = 1UL << (LNG_BIT - 1);
limits.h 얻으려면 "낮은 INT"?
#define INT_BIT (sizeof(int) * CHAR_BIT)
if (LNG_BIT > INT_BIT)
return num & (~0UL >> INT_BIT);
else
return num;
또는
num &= ~(~0U << INT_BIT);
또는 사용 마스크 같은 것을, 등등. 왜, 무엇을 위해, 등 원하는지에 따라 크게 다릅니다. int 비트.
컴파일러에서 제공하는 옵션에 주목하십시오. 나는. 당신은 GCC를 사용하는 경우 :
-m32
-m64
-mx32
32 비트 코드를 생성하거나 64 비트 환경.
* -m32 옵션은 int, long 및 포인터 유형을 32 비트로 설정하고 모든 i386 시스템에서 실행되는 코드를 생성합니다.
* -m64 옵션은 int를 32 비트로, long 및 포인터 유형을 64 비트로 설정하고 x86-64 아키텍처 용 코드를 생성합니다. Darwin의 경우 -m64 옵션 만 -fno-pic 및 -mdynamic-no-pic 옵션을 해제합니다.
* -mx32 옵션은 int, long 및 포인터 유형을 32 비트로 설정하고 x86-64 아키텍처 용 코드를 생성합니다.
긴 주소 모드에 대한 코드를 생성 긴 -maddress-mode=long
등
-maddress 모드는 =도있다. 이 기능은 64 비트 및 x32 환경에서만 지원됩니다. 64 비트 환경의 경우 기본 주소 모드입니다.
시도를 사용하여'부호없는 긴 NUM = 1UL를 << 63;' – Mysticial
@Mysticial 왜 게시와 정수 프로모션 물건과 함께 답변? – cnicutar
사용되는 컴파일러에 따라 다릅니다. 많은 레거시 컴파일러는 64 비트 시스템에서 실행되는 경우에도 기본적으로 32 비트 long으로 설정됩니다. 더 많은 것을 시도하기 전에'sizeof num '이 8인지 확인하십시오. – wallyk