2012-10-31 3 views
24

다양한 유형의 64 비트 데이터 모델 (LLP64/IL32P64, LP64/I32LP64, ILP64, SILP64)이 있으므로 64 가지 표준 지정 방법이 무엇입니까? 부호없는 정수 리터럴?64 비트 데이터 모델에서 64 비트 부호없는 정수 리터럴 지정

ULL의 접미사를 지정하면 충분합니까? 아니면 일부 데이터 모델에서 리터럴이 128 비트로 해석되도록해야합니까?

+0

정수를 'uint64_t'에 할당하는 것이 좋을 것입니다. – kennytm

+0

@KennyTM : 문제가 생길 수있는 시점은 최대 2^32 - 1입니다. – DevSolar

+0

@DevSolar : ULL 접미어가 붙은 정수로 18446744073709551615까지만 유효합니다. – kennytm

답변

34

갖고 계신 경우 <cstdint>/<stdint.h>을 사용해야합니다. 이것은 줄 것이다

  • uint64_t
  • UINT64_C() 매크로 APPEND에게 적절한 접미사를 구비함으로써, 입력 uint64_t의 상수를 생성하는 매크로 인 사이즈 64 비트 부호없는 정수의 형태이다.
+2

은 UINT64_C가 C++에서 사용 가능함을 보장합니까? (질문은 C++가 아니라 C99) – jalf

+0

@jalf 좋은 지적, 감사합니다! 나는 확실치 않지만, 그렇다고 보인다. 필자는 링크를 다시 작성하고 변경했습니다. – unwind

0

제 생각에 특정 비트 폭에 정수 리터럴을 접미사로 붙일 방법이 없습니다. 유일한 옵션은 l, ul, ll 및 ull입니다.

당신이 편집증 환자라면 long/long long의 크기를 확인하기 위해 #if에서 리터럴을 포장해야합니다. 다시 그런

, KennyTM 위에서 지적했듯이, 한 당신의 리터럴 는 64 비트 값에 할당 된 64 비트 범위 이기 때문에, 그것은 중요하지 않습니다 많은 문자 자체가 64 또는 128 비트 인 경우 또는 그거야?

+0

컴파일러가 더 큰 비트 너비가 필요한 정수를 더 작게 (불일치 경고) 할당하고 있다고 불평하지 않겠습니까? –

+0

대문자 접미사를 사용하면 부호가있는 리터럴을 1l, 1ll 대신 1L, 1LL로 표시 할 수 있습니다. – pixelgrease

+0

... 1/l, 0/O를 적절히 구별하는 글꼴을 사용하십시오 ... – DevSolar

1

C 및 C++에는 표준화 된 32/64/128 비트 변수 유형이 없습니다. 예를 들어 어떤 시스템에서는 32 비트와 64 비트가 길다. 성가시다. 그러나 대부분의 OS는 uint32 등과 같이 당신을 도울 수있는 더 나은 typedef를 제공하므로 필요한 정확한 유형을 선택해야한다.

좋은 configure 스크립트는 시스템에서 제공하는 기능을 확인하고 작동하는지 테스트 한 다음 실행중인 올바른 아키텍처에 적합한 유형을 선택하는 데 도움이됩니다.

+3

C 및 C++ * do *는 ''및 ''헤더에 주어진 크기의 표준화 된 변수 유형을 제공합니다. 그것들은'uint32_t'와 같은 이름을 가지고 있습니다. – amaurea

+0

@amaurea - ** 정확한 크기 **가없는 시스템에서는'uint32_t'와 같은 이름을 사용할 수 없습니다. 대부분의 경우'uint_least32_t' 등이 더 나은 선택이 될 것입니다. –

+0

'uint32_t'와'uint64_t'가없는 @Pete Becker 시스템은 찾기가 거의 불가능합니다. 바이트가 8 비트가 아닌 다른 시스템과 다른 카테고리에 속하는 다른 카테고리와 다른 호기심에 빠지겠습니까? – amaurea

1

대부분의 경우 중요하지 않습니다. 접미사를 지정하지 않으면 정수 리터럴의 유형은 해당 값에 의해 결정됩니다. 컴파일러에 32 비트 unsigned long과 64 비트 unsigned long long이있는 경우 부호가없는 값은 unsigned long에 적합하기에는 너무 크지 만 unsigned long long에 대해서는 너무 크지 않은 부호있는 값은 unsigned long long입니다.

관련 문제