programing

int64_t의 정의

newsource 2022. 8. 7. 16:56

int64_t의 정의

C/C++는 처음이라 기본적인 타입에 대해 몇 가지 질문이 있습니다.

a) 어떤 차이가 있는지 설명해 주시겠습니까?int64_t ★★★★★★★★★★★★★★★★★」long )long int로는 둘 다 64번둘둘 중하 택택 택택 택? ???

는 b)의 했습니다.int64_t웹상에서 큰 성공을 거두지 못했다.그런 질문에 대해 제가 상담해야 할 권위 있는 소식통이 있나요?

c)를 사용하는 int64_t컴파일 하기 위해서, 나는 현재 포함시키고 있다.<iostream> ?int64_t

a) 어떤 차이가 있는지 설명해 주시겠습니까?int64_t ★★★★★★★★★★★★★★★★★」long )long int로는 둘 다 64번둘둘 중하 택택 택택 택? ???

전자는 정확히 64비트의 부호 있는 정수형입니다.후자는 32비트 이상의 부호 있는 정수형입니다.

는 b)의 했습니다.int64_t웹상에서 큰 성공을 거두지 못했다.그런 질문에 대해 제가 상담해야 할 권위 있는 소식통이 있나요?

http://cppreference.com 에서는, 다음의 URL 에 대해 설명합니다.http://en.cppreference.com/w/cpp/types/integer단, 신뢰할 수 있는 송신원은 C++ 표준입니다(이 특정 비트는 § 18.4 Integer types [cstdint]에 기재되어 있습니다).

c)를 사용하는 int64_t컴파일하기 위해서, 나는 포함시키고 있다.<iostream> ?int64_t

.<cstdint> ★★★★★★★★★★★★★★★★★」<cinttypes> ('네임스페이스')std) 、 、 는 、 「 」<stdint.h> ★★★★★★★★★★★★★★★★★」<inttypes.h>(일부러)

int64_tC99 규격에 의해 C99를 실장하는 플랫폼에서는 정확하게 64비트의 을 보증합니다.long32번입니다.

§ 7.18.1.3 정확한 폭의 정수형 1 typedef name intN_t는 너비 N, 패딩 비트 없음 및 2의 보완 표현을 갖는 부호 있는 정수형을 나타낸다.따라서 int8_t는 정확히 8비트의 폭을 갖는 부호 있는 정수형을 나타냅니다.

int64_ttypedef은 '어디서'에 .<stdint.h> c c c로

int64_t는 임의의 플랫폼에서 64비트폭(이름을 따옴)으로 해야 합니다.단, long은 플랫폼마다 길이가 다를 수 있습니다.특히, size of(long)는 종종 4(즉, 32비트)입니다.

현재 구현 시점 및 k8(x86_64) 아키텍처의 SWIG 사용자를 위한 2센트입니다.

리눅스

첫번째long long그리고.long int다른 타입이지만sizeof(long long) == sizeof(long int) == sizeof(int64_t)

GCC

먼저 컴파일러가 int64_t와 uint64_t를 정의하는 위치와 방법을 찾습니다.

grepc -rn "typedef.*INT64_TYPE" /lib/gcc
/lib/gcc/x86_64-linux-gnu/9/include/stdint-gcc.h:43:typedef __INT64_TYPE__ int64_t;
/lib/gcc/x86_64-linux-gnu/9/include/stdint-gcc.h:55:typedef __UINT64_TYPE__ uint64_t;

따라서 이 컴파일러 매크로 정의를 찾아야 합니다.

gcc -dM -E -x c /dev/null | grep __INT64                 
#define __INT64_C(c) c ## L
#define __INT64_MAX__ 0x7fffffffffffffffL
#define __INT64_TYPE__ long int

gcc -dM -E -x c++ /dev/null | grep __INT64
#define __INT64_C(c) c ## L
#define __INT64_MAX__ 0x7fffffffffffffffL
#define __INT64_TYPE__ long int

쨍그랑

clang -dM -E -x c++ /dev/null | grep INT64_TYPE
#define __INT64_TYPE__ long int
#define __UINT64_TYPE__ long unsigned int

Clang, GNU 컴파일러:
-dM는 매크로 목록을 덤프합니다.
-E파일 대신 stdout에 결과를 인쇄합니다.
-x c그리고.-x c++다음과 같이 파일 확장자가 없는 파일을 사용할 때 프로그래밍 언어를 선택합니다./dev/null

참고 자료: https://web.archive.org/web/20190803041507/http://https://web.archive.org/web/20190803041507/http

주의: swig 사용자의 경우 Linux x86_64에서 를 사용합니다.-DSWIGWORDSIZE64

MacOS

Catalina 10.15 IIRC에서

쨍그랑

clang -dM -E -x c++ /dev/null | grep INT64_TYPE
#define __INT64_TYPE__ long long int
#define __UINT64_TYPE__ long long unsigned int

쨍그랑:
-dM는 매크로 목록을 덤프합니다.
-E파일 대신 stdout에 결과를 인쇄합니다.
-x c그리고.-x c++다음과 같이 파일 확장자가 없는 파일을 사용할 때 프로그래밍 언어를 선택합니다./dev/null

참고 자료: https://web.archive.org/web/20190803041507/http://https://web.archive.org/web/20190803041507/http

참고: swig 사용자의 경우 MacOS x86_64에서는 사용하지 마십시오.-DSWIGWORDSIZE64

비주얼 스튜디오 2019

첫번째sizeof(long int) == 4그리고.sizeof(long long) == 8

stdint.h다음과 같은 것이 있습니다.

#if _VCRT_COMPILER_PREPROCESSOR

typedef signed char        int8_t;
typedef short              int16_t;
typedef int                int32_t;
typedef long long          int64_t;
typedef unsigned char      uint8_t;
typedef unsigned short     uint16_t;
typedef unsigned int       uint32_t;
typedef unsigned long long uint64_t;

주의: swig 사용자의 경우 Windows x86_64에서는 사용하지 마십시오.-DSWIGWORDSIZE64

SWIG 관련 정보

먼저 https://github.com/swig/swig/blob/3a329566f8ae6210a610012ecd60f6455229fe77/Lib/stdint.i#L20-L24 를 참조해 주세요.그러면 typedef 를 제어할 수 있습니다.SWIGWORDSIZE64그렇지만.....

단점: SWIG Java 및 SWIG CSHARP는 고려되지 않습니다.

그래서 당신은 아마 그것을 사용하는 것이 좋을지도 모릅니다.

#if defined(SWIGJAVA)
#if defined(SWIGWORDSIZE64)
%define PRIMITIVE_TYPEMAP(NEW_TYPE, TYPE)
%clear NEW_TYPE;
%clear NEW_TYPE *;
%clear NEW_TYPE &;
%clear const NEW_TYPE &;
%apply TYPE { NEW_TYPE };
%apply TYPE * { NEW_TYPE * };
%apply TYPE & { NEW_TYPE & };
%apply const TYPE & { const NEW_TYPE & };
%enddef // PRIMITIVE_TYPEMAP
PRIMITIVE_TYPEMAP(long int, long long);
PRIMITIVE_TYPEMAP(unsigned long int, long long);
#undef PRIMITIVE_TYPEMAP
#endif // defined(SWIGWORDSIZE64)
#endif // defined(SWIGJAVA)

그리고.

#if defined(SWIGCSHARP)
#if defined(SWIGWORDSIZE64)
%define PRIMITIVE_TYPEMAP(NEW_TYPE, TYPE)
%clear NEW_TYPE;
%clear NEW_TYPE *;
%clear NEW_TYPE &;
%clear const NEW_TYPE &;
%apply TYPE { NEW_TYPE };
%apply TYPE * { NEW_TYPE * };
%apply TYPE & { NEW_TYPE & };
%apply const TYPE & { const NEW_TYPE & };
%enddef // PRIMITIVE_TYPEMAP
PRIMITIVE_TYPEMAP(long int, long long);
PRIMITIVE_TYPEMAP(unsigned long int, unsigned long long);
#undef PRIMITIVE_TYPEMAP
#endif // defined(SWIGWORDSIZE64)
#endif // defined(SWIGCSHARP)

그렇게int64_t아카long intJava/C# 에 바인드 됩니다.longLinux에서...

언급URL : https://stackoverflow.com/questions/13604137/definition-of-int64-t