WORD_BIT 및 LONG_BIT

WORD_BIT 및 LONG_BIT

WORD_BIT이들그리고 그리고 의 차이점은 무엇인가요 LONG_BIT? 내 시스템의 단어 크기를 알아내려면 어느 것을 사용해야 합니까? 둘 다 다른 결과를 반환합니다.

➜  ~ getconf LONG_BIT
64
➜  ~ getconf WORD_BIT
32
➜  ~ 

나는 또한 단어 크기를 알아내는 신뢰할 수 있는 방법은 공백 크기를 인쇄하는 것이라는 다른 기사를 읽었습니다. 이렇게 하면 8바이트가 됩니다.

printf("%d\n", (int)sizeof(void*)); 

이것은 항상 반환된 결과와 동일합니까 getconf LONG_BIT?

죄송합니다. 또 다른 질문이 있습니다. 단어 길이는 CPU 아키텍처와 관련이 있습니다. 운영 체제가 CPU 아키텍처에 정의된 동일한 단어 길이에서도 실행될 수 있습니까?

답변1

POSIX 정의 WORD_BITLONG_BITint는 각각 및 유형의 객체에 있는 비트 수입니다 long. 유형 객체의 크기는 void *데이터에 대한 포인터의 크기입니다.

32비트 int및 64비트 long와 포인터는 64비트 x86 기반 Linux의 표준 모델입니다. 이를 LP64라고 합니다(System V ABI에 대한 AMD64 확장 참조).

이러한 크기 사이에는 관계가 없습니다. C에서 제공하는 유일한 크기 평등 보장은 sizeof(char)1입니다. 예를 들어 x64 기반 Windows는 32비트 longint64비트 포인터를 사용합니다. (다른 크기 요구 사항이 있습니다. C는 sizeof(short)sizeof(int)sizeof(long), short합계 int가 최소 16비트, 합계가 long최소 32비트임을 보장합니다. POSIX에서는 int합계 long길이가 최소 32비트여야 합니다.)

운영체제와 CPU를 일치시키는 측면에서 가장 중요한 객체 크기는 포인터 크기(어떻게 처리 int하고 long컴파일러의 주요 관심사인지)이지만, 운영체제와 CPU 포인터 크기 간의 관계가 항상 간단한 것은 아닙니다. 운영 체제는 포인터 크기를 사용해야 합니다.지원됨CPU에 따라 결정되지만 CPU는 여러 포인터 크기를 지원할 수 있습니다. 예를 들어 64비트 x86 CPU²는 64비트 운영 체제(Windows x64, 64비트 Linux 등), 32비트 운영 체제를 실행할 수 있습니다. (Windows x32, 32비트 Linux, OS /2 등) 및 16비트 운영 체제(예: MS-DOS). 64비트 운영 체제에서도 위에서 언급한 것처럼 차이가 있을 수 있으며(Windows x64에서는 32비트 long, 64비트 longLinux에서는 64비트) 심지어 "기본" 포인터 크기도 기대한 것과 다를 수 있습니다(Linuxx32 ABI및 사용자 공간에서 32비트 포인터를 사용하는 SPARC). 역사적으로 64비트 Alpha 플랫폼에 출시된 Windows 버전은 32비트 운영 체제였습니다.


1 일부 환경(내가 아는 한 Unix가 아닌 환경)에서는 데이터에 대한 포인터가 함수에 대한 포인터와 항상 같은 크기는 아닙니다.

² Intel이 출시될 때까지 적절한 펌웨어 지원X86SCPU.

답변2

몇 가지 추가 정보를 추가하려면 "포인터 크기"라는 문구가 모호합니다. 내부에x86 메모리 모델"중형" 및 "컴팩트" 모델은 데이터 포인터의 크기와 코드 포인터의 크기가 다릅니다. 유형은 void *데이터에 대한 포인터를 나타냅니다.

관련 정보