64 비트 Windows에서 long의 비트 크기는 얼마입니까? 비트 컴퓨터에서 64 비트가 아니라고 말했고 항상

얼마 전까지 만해도 누군가 long64 비트 컴퓨터에서 64 비트가 아니라고 말했고 항상 사용해야 int합니다. 이것은 나에게 이해가되지 않았다. 필자는 Apple 공식 사이트의 문서와 같은 문서 long가 64 비트 CPU를 컴파일 할 때 실제로 64 비트 라고 말합니다 . 나는 그것이 64 비트 Windows에서 무엇인지 찾아보고

  • 윈도우 : longint길이가 32 비트를 유지하며, 특별한 새로운 데이터 형식은 64 비트 정수에 대해 정의된다.

( http://www.intel.com/cd/ids/developer/asmo-na/eng/197664.htm?page=2에서 )

무엇을 사용해야합니까? Windows에서 아닌 경우 uw, sw((un) 부호가있는 너비)와 같은 것을 정의 long하고 그렇지 않으면 대상 CPU 비트 크기를 확인해야합니까?



답변

유닉스 세계에서, 64 비트 플랫폼을위한 정수와 포인터의 크기에 대한 몇 가지 가능한 배열이있었습니다. 가장 널리 사용되는 두 가지는 ILP64 (실제로이 예는 극소수에 불과합니다. 약어는 ‘int, long, 포인터는 64 비트’및 ‘long, 포인터는 64 비트’에서 나옵니다.

Type           ILP64   LP64   LLP64
char              8      8       8
short            16     16      16
int              64     32      32
long             64     64      32
long long        64     64      64
pointer          64     64      64

ILP64 시스템은 LP64 에 찬성하여 포기되었습니다. 즉, 거의 모든 이후 참가자는 아스펜 그룹의 권장 사항에 따라 LP64를 사용했습니다. 모든 최신 64 비트 유닉스 시스템은 LP64를 사용합니다. MacOS X와 ​​Linux는 모두 최신 64 비트 시스템입니다.

Microsoft는 64 비트로 전환하기 위해 LLP64 ( ‘길이가 길고 포인터가 64 비트’)라는 다른 체계를 사용합니다. 이는 32 비트 소프트웨어를 변경하지 않고 다시 컴파일 할 수 있다는 의미가 있습니다. 그것은 다른 사람들과 다른 단점이 있으며 64 비트 용량을 이용하기 위해 코드를 수정해야합니다. 항상 수정이 필요했습니다. 그것은 유닉스 플랫폼에서 필요한 것과는 다른 개정 세트였습니다.

플랫폼 중립 정수 유형 이름을 중심으로 소프트웨어를 설계하는 경우 C99 <inttypes.h>헤더를 사용 하여 플랫폼에서 유형을 사용할 수있는 경우 부호있는 (목록에있는) 및 부호없는 (나열되지 않은 접두사 : ‘u’)를 제공합니다.

  • int8_t -8 비트 정수
  • int16_t -16 비트 정수
  • int32_t -32 비트 정수
  • int64_t -64 비트 정수
  • uintptr_t -포인터를 담을 수있을 정도로 큰 부호없는 정수
  • intmax_t-플랫폼에서 가장 큰 정수 크기 (보다 클 수 있음 int64_t)

그런 다음, 이러한 유형을 중요한 곳에 사용하고 시스템 유형 (상이 할 수 있음)에 매우주의하여 응용 프로그램을 코딩 할 수 있습니다. 이 intptr_t유형 – 포인터를 유지하는 부호있는 정수 유형으로, 사용하지 않거나 두 uintptr_t값을 뺀 결과로만 사용하도록 계획해야 합니다 ( ptrdiff_t).

그러나 문제가 불신으로 지적한 것처럼 64 비트 시스템에는 정수 데이터 유형의 크기에 따라 다른 시스템이 있습니다. 그것에 익숙해; 세상은 변하지 않을 것입니다.


답변

Microsoft C ++ 컴파일러 또는 Windows API에 대한 질문인지 확실하지 않습니다. 그러나 [c ++] 태그가 없으므로 Windows API에 관한 것으로 가정합니다. 답변 중 일부가 링크 썩음으로 어려움을 겪었으므로 썩을 수있는 또 다른 링크를 제공하고 있습니다.


같은 윈도우 API 유형에 대한 자세한 내용은 INT, LONG등 MSDN에 페이지가있다 :

Windows 데이터 유형

이 정보는와 같은 다양한 Windows 헤더 파일에서도 사용할 수 있습니다 WinDef.h. 여기에 몇 가지 관련 유형이 나열되어 있습니다.

타입 | S / U | x86 | x64
---------------------------- + ----- + -------- + ------ -
부산, 바이트 | U | 8 비트 | 8 비트
---------------------------- + ----- + -------- + ------ -
짧은 | S | 16 비트 | 16 비트
우호, 단어 | U | 16 비트 | 16 비트
---------------------------- + ----- + -------- + ------ -
INT, LONG | S | 32 비트 | 32 비트
UINT, ULONG, DWORD | U | 32 비트 | 32 비트
---------------------------- + ----- + -------- + ------ -
INT_PTR, LONG_PTR, LPARAM | S | 32 비트 | 64 비트
UINT_PTR, ULONG_PTR, WPARAM | U | 32 비트 | 64 비트
---------------------------- + ----- + -------- + ------ -
긴 | S | 64 비트 | 64 비트
ULONGLONG, QWORD | U | 64 비트 | 64 비트

“S / U”열은 부호있는 / 부호없는 것을 나타냅니다.


답변

MSDN 의이 기사는 너비와 관련하여 좀 더 명백한 여러 유형 별칭 (Windows에서 사용 가능)을 참조합니다.

http://msdn.microsoft.com/en-us/library/aa505945.aspx

예를 들어 ULONGLONG을 사용하여 부호없는 64 비트 정수 값을 참조 할 수 있지만 UINT64를 사용할 수도 있습니다. (ULONG과 UINT32도 마찬가지입니다.) 아마도 이것들은 조금 더 명확할까요?


답변

또한 Microsoft는 포인터와 동일한 크기의 정수에 대해 UINT_PTR 및 INT_PTR을 정의했습니다.

다음은 Microsoft 특정 유형목록입니다 -드라이버 참조의 일부이지만 일반 프로그래밍에도 유효하다고 생각합니다.


답변

컴파일러 / 플랫폼에 대해 가장 쉽게 알 수있는 방법은 다음과 같습니다.

#include <iostream>

int main() {
  std::cout << sizeof(long)*8 << std::endl;
}

8을 곱하면 바이트에서 비트를 얻는 것입니다.

특정 크기가 필요한 경우 사전 정의 된 유형의 라이브러리 중 하나를 사용하는 것이 가장 쉬운 경우가 많습니다. 이것이 바람직하지 않은 경우 autoconf 소프트웨어에서 자주 발생하는 작업을 수행하고 구성 시스템이 필요한 크기에 적합한 유형을 결정하도록 할 수 있습니다.


답변

longWindows 플랫폼 에서 비트 크기 는 32 비트 (4 바이트)입니다.

를 사용하여 확인할 수 있습니다 sizeof(long).


답변

특정 길이의 정수를 사용해야하는 경우 플랫폼 독립 헤더를 사용해야합니다. 부스트는보기 좋은 곳입니다.