IT이야기

gcc에 128비트 정수가 있니?

cyworld 2022. 4. 24. 09:41
반응형

gcc에 128비트 정수가 있니?

나는 128비트 정수를 원한다. 왜냐하면 나는 두 64비트 숫자의 곱셈 결과를 저장하고 싶기 때문이다.gcc 4.4 이상에 그런 것이 있는가?

128비트 정수형은 64비트 대상에서만 사용할 수 있기 때문에 이미 최근 GCC 버전을 감지했더라도 가용성을 확인해야 한다.이론적으로 gcc는 하나를 보유하는 데 4x32비트 레지스터가 필요한 기계에서 TImode 정수를 지원할 수 있지만, 나는 그렇게 하는 경우는 없다고 생각한다.


GCC 4.6 이상에는 내장형 /이 정의되어 있다.사용하다
#ifdef __SIZEOF_INT128__ 그것을 탐지하기 위해서.

GCC 4.1 이상에서는 기본 제공 유형으로 정의한다.(필요 없음)#include <stdint.h>이것들도 마찬가지야Godbolt에 대한 증거).

나는 Godbolt 컴파일러 탐색기에서 이 세 가지를 각각 지원하는 컴파일러의 첫 번째 버전을 테스트했다(x86-64).고드볼트는 gcc4.1, ICC13, clang3.0으로만 거슬러 올라가기 때문에 실제 첫 지원이 훨씬 더 빠를 수도 있었음을 나타내기 위해 <= 4.1>을 사용해 보았다.

         legacy               recommended(?)    |  One way of detecting support
        __uint128_t   |  [unsigned]  __int128   |  #ifdef __SIZEOF_INT128__
gcc        <=  4.1    |       4.6               |     4.6
clang      <=  3.0    |       3.1               |     3.3
ICC        <=  13     |     <= 13               |     16.  (Godbolt doesn't have 14 or 15)

ARM이나 x86과 같은 32비트 아키텍처용으로 컴파일할 경우 이러한 컴파일러의 최신 버전에서도 128비트 정수 유형이 지원되지 않는다.따라서 코드를 사용하지 않고도 코드가 전혀 작동할 수 있다면 사용하기 전에 지원 기능을 감지할 필요가 있다.

있는 하게 검출이 한 것이 내가라고 하는 것이다.__SIZEOF_INT128__, 그러나 불행히도 몇몇 오래된 컴파일러 버전은 그것을 정의하지 않고 지원한다. (그리고 매크로는 없다.__uint128_t6 , gcc4.6 Stewsday.unsigned __int128__uint128_t가 정의되어 있는지 확인하는 방법

어떤 사람들은 여전히 RHEL (RedHat Enterprise Linux)의 gcc4.4와 같은 고대 컴파일러 버전을 사용한다.그런 구식 gcc 버전에 신경 쓴다면 아마 고수하고 싶을 것이다.__uint128_t. 그리고 어쩌면 64비트를 감지할 수 있다.sizeof(void*) == 8의 단점으로서.__SIZEOF_INT128__정의되지 않음.(GNU 시스템은 항상CHAR_BIT==8). 64비트 ISA(x86-64 Linux x32 또는 AArch64 ILP32와 같은)의 ILP32 ABI에 대해 잘못된 음을 제공하지만, 이는 이미 정의되지 않은 오래된 컴파일러를 사용하는 사람들에게 단점/보너스일 뿐이다.__SIZEOF_INT128__.

gcc가 정의하지 않는 64비트 ISA도 있을 수 있다.__int128, 또는 심지어 gcc가 정의하는 32비트 ISA도 있다.__int128하지만 난 아무것도 몰라.


여기서 또 다른 답변에 대한 코멘트가 지적하듯이, GCC 내부는 정수 TI모드(Tetra-integer = 4x 폭)이다.int, 대 DI 모드 = 이중 폭 대SI 모드 = 일반int.) GCC 매뉴얼에서 지적한 바와 같이,__int128128비트 정수 모드(TImode)를 지원하는 대상에서 지원됨.

// __uint128_t is pre-defined equivalently to this
typedef unsigned uint128 __attribute__ ((mode (TI)));

무작위 팩트: ICC19 및 g++/clang+++-E -dM정의:

#define __GLIBCXX_TYPE_INT_N_0 __int128
#define __GLIBCXX_BITSIZE_INT_N_0 128

@MarcGlisse는 당신이 libstdc++에게 추가적인 정수 타입(과부하 복근, 전문화된 타입 특성 등)을 처리하라고 말하는 방식이다.

icpc을 정의한다.-xc(C++가 아닌 C로 컴파일) g++ -xc와 clang+++ -xc는 그렇지 않다.그러나 실제와 함께 컴파일icc(예: Godbolt 드롭다운에서 C++ 대신 C를 선택) 이 매크로를 정의하지 않는다.


테스트 기능은 다음과 같다.

#include <stdint.h>   // for uint64_t

#define uint128_t __uint128_t
//#define uint128_t unsigned __int128

uint128_t mul64(uint64_t a, uint64_t b) {
    return (uint128_t)a * b;
}

그것을 모두 지원하는 컴파일러들은 그것을 효율적으로 컴파일한다.

    mov       rax, rdi
    mul       rsi
    ret                  # return in RDX:RAX which mul uses implicitly

GNU MP Bignum Library와 같이 임의 또는 큰 정밀도 값을 처리하는 라이브러리를 사용할 수 있다.

아, 큰 정수는 C의 특기가 아니다.

GCC에는unsigned __int128/__int128유형, 버전 4.something부터 시작(여기는 확실하지 않음).그러나 나는 기억나는 것 같다. 거기에는 어떤 것이 있었다.__int128_t그전에 반항하다

이는 64비트 대상에서만 사용할 수 있다.

(편집자 메모: 이 답변은 gcc가 정의했다고 주장하기 위해 사용되었다.uint128_t그리고int128_tGodbolt 컴파일러 탐색기에서 테스트한 버전 중 어떤 버전도 선도 없이 이러한 유형을 정의하지 않음__, gcc4.1 ~ 8.2 또는 clang 또는 ICC).

참조URL: https://stackoverflow.com/questions/16088282/is-there-a-128-bit-integer-in-gcc

반응형