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_t
6 , 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 매뉴얼에서 지적한 바와 같이,__int128
128비트 정수 모드(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_t
Godbolt 컴파일러 탐색기에서 테스트한 버전 중 어떤 버전도 선도 없이 이러한 유형을 정의하지 않음__
, gcc4.1 ~ 8.2 또는 clang 또는 ICC).
참조URL: https://stackoverflow.com/questions/16088282/is-there-a-128-bit-integer-in-gcc
'IT이야기' 카테고리의 다른 글
Vuex: Vuex의 이상한 행동에 대한 이상한 질문.하나 이상의 돌연변이와 스토어 개체를 업데이트하거나 할당하는 커밋이 필요한 경우 (0) | 2022.04.24 |
---|---|
VueJs에서 지정된 명명된 슬롯에 어린이를 렌더링하는 방법 (0) | 2022.04.24 |
C의 함수에서 '구조물' 반환 (0) | 2022.04.24 |
프로그래밍 방식으로 시스템의 코어 수 찾기 (0) | 2022.04.24 |
Vue.js의 프로펠러에 값이 공급되는지 점검하십시오. (0) | 2022.04.24 |