2010-12-30 4 views
17

을 특히,이 두 선언 하였다 :?.을합니까 이것은 C 언어와의 bignum 라이브러리와 GCC 특정 해킹의 주제에 오늘 아침 일찍 질문에서 발생한

을 32 비트 시스템에서
typedef unsigned int dword_t __attribute__((mode(DI))); 

및 64 비트 시스템에서

typedef unsigned int dword_t __attribute__((mode(TI))); 

. 나는 주어진 맡기

이 그것을 달성 무엇이든 달성 할 수있는 방법이 존재하지 않음을 C 언어의 확장입니다 현재의 (C99) 표준.

제 질문은 간단합니다. 가정은 맞습니까? 그리고이 진술들은 근본적인 기억에 대해 무엇을 하는가? 나는 결과가 32 비트 시스템에서는 dword 인 경우 2*sizeof(uint32_t)이고, 64 비트 시스템에서는 2*sizeof(uint64_t) 인 것으로 나는 생각한다.

답변

21

이렇게하면 'long'또는 'int'크기와 같은 컴파일러 나 시스템 의미에 의존하지 않고 유형의 크기를 명시 적으로 지정할 수 있습니다.

그들은 꽤 잘 설명되어 있습니다. on this page.

I는 해당 페이지에서 인용 :

QI 다음 가장 작은 단위 일반적 8 비트만큼 넓다 정수.

HI : 의 두 배인 QI 모드 정수. 대개 16 비트입니다.

SI : 정수, QI 모드 정수의 4 배, 보통 32 비트입니다.

DI : 모드 정수 (일반적으로 64 비트)의 8 배입니다.

SF : 부동 소수점 값으로서 SI 모드 정수 (일반적으로 32 비트)와 동일합니다.

DF : A 부동 소수점 값으로, DI 모드 정수 (일반적으로 64 비트)와 동일합니다.

따라서 DI은 본질적으로 sizeof(char) * 8입니다.

TI 모드를 포함한 자세한 설명은 here (첫 번째 링크보다 좋을 수도 있지만 둘 다 참조 용으로 제공됨)을 참조하십시오.

따라서 TI은 본질적으로 sizeof(char) * 16 (128 비트)입니다.

+0

을 나는 일이 필요 그냥 무슨. 그 때 이것을 극복하기위한 "표준"방법이 없습니까? 즉 128 비트 타입을 선언하겠습니까? 현재의 사용법에서'dword = word << 1 '을 안전하고 쉽게 할 수 있습니다; 내가 그것을 도울 수 있다면 나는 그것을 함수 등으로 대체하지 않을 것이다. –

+0

@Ninefingers : GCC에서는'__int128'을 사용할 수 있습니다. http://gcc.gnu.org/onlinedocs/gcc/_005f_005fint128.html. –

+0

@Ninefingers : GCC는 확장 유형'__int128_t'과'__uint128_t'를 지원합니다 (적어도 64 비트 플랫폼에서는 32 비트 타겟에 대해서는 확실하지 않습니다). –

2

@ haelix이 질문을 읽고이 문제를 이해하려고 노력했습니다. 필자는 GCC 소스 트리의 [gcc/gcc/machmode.def]에서 정의를 찾을 수 있습니다.'SD'의 경우는해야한다 :

/* Decimal floating point modes. */ 
DECIMAL_FLOAT_MODE (SD, 4, decimal_single_format); 

와 'DECIMAL_FLOAT_MODE'는 말한다 :

 DECIMAL_FLOAT_MODE (MODE, BYTESIZE, FORMAT); 
declares MODE to be of class DECIMAL_FLOAT and BYTESIZE bytes 
wide. All of the bits of its representation are significant.